我想调试在系统启动时调用的C ++函数,因此当我手动连接gdb并设置断点时,该函数已被调用并返回。
我试图设置一个无限循环,但系统似乎已经选择了它并向前移动。
答案 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资源。睡觉直到你可以调试是另一种选择。