【问题标题】:Can I set an LLDB breakpoint when multiple Rust source files share the same name?当多个 Rust 源文件共享相同名称时,我可以设置 LLDB 断点吗?
【发布时间】:2016-04-23 22:21:21
【问题描述】:

背景:在 Rust 中,您通常有多个名为 mod.rs 的源文件。例如:

app_name
  src
    main.rs
    foo
      mod.rs
    bar
      mod.rs

问题:在设置 LLDB 断点时,我找不到区分 mod.rs 和另一个的方法:

$ 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。更一般地说,只要多个源文件共享相同的名称,就会出现这种情况。

问题:有没有办法在foo/mod.rs的第10行设置断点,但不在bar/mod.rs的第10行设置断点?

【问题讨论】:

标签: rust lldb


【解决方案1】:

您可以使用文件的绝对路径。就我而言,我在 OS X 上的/tmp 目录中编译,实际上是/private/tmp。这意味着我可以这样做:

breakpoint set --file /private/tmp/debug/src/bar/mod.rs --line 2

我通过查看 DWARF 调试信息发现了这一点:

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 用数字 ID 建立一个逻辑断点(如1),然后匹配条件的真正断点有一个子 ID(如1.1)。您可以使用breakpoint list 查看这些,然后使用breakpoint disable 1.1 禁用其他。

【讨论】:

  • 在给定名称重整(默认开启)的情况下,是否会破坏函数名称?
  • @SamElliott 是的。默认情况下,调试器(应该)知道名称修改和取消修改。如果他们不这样做,lldb 允许您使用正则表达式设置断点:breakpoint set -r '.*foo.*'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2016-09-09
相关资源
最近更新 更多