如何在函数中设置一个可以被gdb检测到的断点

时间:2014-12-14 14:16:56

标签: gdb

我想调试在系统启动时调用的C ++函数,因此当我手动连接gdb并设置断点时,该函数已被调用并返回。

我试图设置一个无限循环,但系统似乎已经选择了它并向前移动。

2 个答案:

答案 0 :(得分:1)

  

我试图设置一个无限循环,但系统似乎已经选择了它并向前移动。

如果您要在调试方面有效,首先需要了解的是确认您的假设。

“系统似乎......”不是一个可接受的假设,你需要使用GDB disas命令确认确实发生了这种情况。

编译器也可以不可能来优化这样的无限循环:

volatile int gdb_attached = 0;
while (!gdb_attached) {
  printf("Waiting for gdb to attach\n");
  sleep(1);
}

如果你把一个上面的循环放到你的函数中,可以保证(假设你的编译器没有异常错误)你的函数(如果它被称为 at all )将不会返回,直到你附加GDB到您的流程,并将gdb_attached设置为GDB的非零值。

答案 1 :(得分:0)

我假设你想在正在运行的进程中使用gdb

如果您使用g++作为编译器,则可以使用-O0标志来避免优化。或者在循环中做一些编译器无法优化的事情。例如更改循环外部变量的值或将一些随机内容打印到输出中。

此外,繁忙的等待过程可能不是一个好主意,因为它浪费了大量的CPU资源。睡觉直到你可以调试是另一种选择。