Как получить обратную трассировку для программы Rust, которая использует afl.rs для фаззинга?
Я использую afl.rs для создания программы Rust с американской Fuzzy Lop. AFL обнаружил, что программа вызывает панику. Сейчас я пытаюсь отладить панику, и я хочу начать с просмотра обратной трассировки. Но ни один из методов, которые я пробовал, не сработал. Как я могу получить обратную трассировку?
Я надеялся получить след с обычным RUST_BACKTRACE
метод и запуск моей программы за пределами AFL. Однако выполнение этих шагов не приводит к обратному следу.
cargo afl build
export RUST_BACKTRACE=1
# Echo one of the invalid inputs found by AFL, as logged in the crashes directory
echo 'http://[:]:example.co]:80/fo=bar' | ./target/debug/url-fuzz-target
Я тоже пробовал export RUST_BACKTRACE=1; cargo afl fuzz [arguments]
но AFL не сохранял следы нигде в выходном каталоге.
В настоящее время мой обходной путь заключается в создании второго исполняемого файла, который не вызывает extern crate afl
и использовать это для отладки. Я бы предпочел не делать этого, потому что поддерживать две программы очень сложно. Есть ли лучший способ получить обратную трассировку?
Исходный код
Зависимости в Cargo.toml:[dependencies]
afl = "0.4"
# This version of the url crate has a known bug in Url::parse()
url = { git = "https://github.com/servo/rust-url.git", rev = "bfa167b4e0253642b6766a7aa74a99df60a94048" }
main.rs:#[macro_use]
extern crate afl;
extern crate url;
fn main() {
fuzz!(|data: &[u8]| {
if let Ok(s) = std::str::from_utf8(data) {
let _ = url::Url::parse(&s);
}
});
}