Можно ли установить точку останова 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 6

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

Есть также несколько обходных путей, если это не работает:

  1. Вместо этого остановитесь на функции: breakpoint set --name my_func. Маловероятно, что у вас будет такое же имя метода, но здесь вы можете использовать модуль имя также: breakpoint set --name foo::my_func.

  2. Отключите неинтересные повторяющиеся точки останова. breakpoint set устанавливает логическую точку останова с числовым идентификатором (например, 1), а затем реальные точки останова, соответствующие условию, имеют идентификатор sub (например, 1.1). Вы можете увидеть их с помощью breakpoint list , а затем отключить другие с помощью breakpoint disable 1.1.