gpt4 book ai didi

c++ - gdb 在检查断点处的条件时失败

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:56 26 4
gpt4 key购买 nike

我定义一个断点

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 的调用并泄漏生成的内存来实现此目的。这也可以终止正在调试的程序。

更新:

I found my program generates incorrect results for the element with name "abc". There are millions of elements. So I wanted to use gdb to stop at some code when the element name is "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 可以访问私有(private)数据。如果 getName 看起来像这样:

const char *getName() { return name_; }

然后你可以像这样重新表述你的条件:

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

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

关于c++ - gdb 在检查断点处的条件时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43772788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com