Можно ли установить точку останова LLDB, когда несколько исходных файлов Rust имеют одно и то же имя?
Фон: в Rust обычно имеется несколько исходных файлов с именем mod.rs
. Например:
app_name
src
main.rs
foo
mod.rs
bar
mod.rs
Проблема: я не могу найти способ отличить один mod.rs
от другого при установке точки останова LLDB:
$ cargo build
$ rust-lldb target/debug/app_name
(lldb) breakpoint set -f mod.rs -l 10
Breakpoint 1: 2 locations.
(lldb) breakpoint set -f foo/mod.rs -l 10
Breakpoint 2: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) breakpoint set -f src/foo/mod.rs -l 10
Breakpoint 3: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
Этот вопрос чаще всего возникает с mod.rs
. В более общем случае он возникает в любое время, когда несколько исходных файлов имеют одно и то же имя.
Вопрос : есть ли способ установить точку останова в строке 10 из foo/mod.rs
, но не в строке 10 из bar/mod.rs
?
1 ответ:
Вы можете использоватьабсолютный путь к файлу. В моем случае я компилировал в каталоге
/tmp
на OS X, который на самом деле является/private/tmp
. Это означает, что я могу сделать что-то вроде этого:breakpoint set --file /private/tmp/debug/src/bar/mod.rs --line 2
Я понял это, посмотрев на отладочную информацию карлика:
dwarfdump target/debug/debug.dSYM/Contents/Resources/DWARF/debug | grep mod.rs
Есть также несколько обходных путей, если это не работает:
Вместо этого остановитесь на функции:
breakpoint set --name my_func
. Маловероятно, что у вас будет такое же имя метода, но здесь вы можете использовать модуль имя также:breakpoint set --name foo::my_func
.Отключите неинтересные повторяющиеся точки останова.
breakpoint set
устанавливает логическую точку останова с числовым идентификатором (например,1
), а затем реальные точки останова, соответствующие условию, имеют идентификатор sub (например,1.1
). Вы можете увидеть их с помощьюbreakpoint list
, а затем отключить другие с помощьюbreakpoint disable 1.1
.