我想在启动主函数之前观察一个全局变量。一个可能的解决方案是创建一个函数,初始化全局变量并在函数上设置断点:
int Init()
{
return 0;
}
int globalX = Init();
//gdb: break Init
//gdb: run
//gdb: awatch globalX
是否可以在不定义函数断点的情况下监视全局变量(在主函数开始之前(?watch globalX
不起作用。
是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前(?
是。然而,GDB只有在程序启动后变量的值发生变化时才会停止,对于用常数值初始化的变量,设置为该值的时间是程序启动前的。
更准确地说:
int foo;
int bar = 42;
int baz = func();
变量foo
被分配在.bss
部分中,并且在处理中的第一条指令执行之前具有值0
。
同样,变量bar
被分配在.data
部分中,并且在第一条指令之前具有值42
(.data
部分中的相应位置在磁盘上具有该值,并且在进程开始之前它被简单地mmap
插入到进程中(。
变量baz
在.data
部分中分配,并被动态初始化——这是进程开始后唯一实际更改其值的变量。您可以watch
该变量并观察初始化发生的位置,而无需在func()
上设置断点。