检查断点处的条件时 gdb 失败

2024-02-11

我定义一个断点

b foo:124 if strcmp(bar::foo::getName(), "abc")==0

但是 gdb 失败并出现以下错误

[Thread 0x7fffe8ef9700 (LWP 25817) exited]
[Switching to Thread 0x7fffdfc2f700 (LWP 25972)]
Error in testing breakpoint condition:
Couldn't get registers: No such process.
An error occurred while in a function called from GDB.
Evaluation of the expression containing the function
(bar::foo::getName() const) will be abandoned.
When the function is done executing, GDB will silently stop.
Selected thread is running.

b foo:124 if strcmp(bar::foo::getName(), "abc")==0

这种情况是“Really Bad Idea(TM)”,原因有二:

  1. 如果应用程序状态损坏(即使是暂时的)并且getName取消引用内存,它可能会崩溃,产生您所观察到的令人困惑的输出。
  2. 为了让GDB评估"abc",它必须在正在调试的程序“内部”合成这些字节。它通过综合调用来做到这一点strdup,并泄漏由此产生的内存。这也可以终止正在调试的程序。

Update:

我发现我的程序为名称为“abc”的元素生成了错误的结果。有数百万个元素。所以我想使用 gdb 在元素名称为“abc”时停止在某些代码处。

您可以使用的技术很少。

最简单的方法是将此代码插入到您的程序中:

const char *const name = getName();
if (strcmp(name, "abc") == 0) {
  if (0) printf("here\n");  // set a breakpoint here 
}

这里的优点是:程序评估条件的速度比 GDB 快得多。并且不必让 GDB 在生成结果的例程的每次调用上停止,而是仅在“有趣”的调用上停止(也更快)。

缺点是你必须重建程序,有时这会使错误隐藏起来。

另一种可能的技术是检查数据getName直接返回(而不是调用getName()) -- GDB 可以访问私有数据。如果getName看起来像这样:

const char *getName() { return name_; }

那么你可以像这样重新制定你的条件:

b foo.cc:124 if (name_[0] == 'a' && name_[1] == 'b' && name_[3] == 'c' && name_[4] == '\0')

这消除了您最初方法的两个问题,但有点冗长。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查断点处的条件时 gdb 失败 的相关文章

随机推荐