gdb-监视全局变量

gdb-监视全局变量,gdb,Gdb,在开始主函数之前,我想看一个全局变量。一种可能的解决方案是创建一个初始化全局变量并在函数上设置断点的函数: int Init() { return 0; } int globalX = Init(); //gdb: break Init //gdb: run //gdb: awatch globalX 是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前)监视globalX不工作 是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前) 对。但是,GDB将仅在程序

在开始主函数之前,我想看一个全局变量。一种可能的解决方案是创建一个初始化全局变量并在函数上设置断点的函数:

int Init()
{
    return 0;
}

int globalX = Init();

//gdb: break Init
//gdb: run
//gdb: awatch globalX
是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前)<代码>监视globalX不工作

是否可以在不定义函数断点的情况下监视全局变量(在主函数启动之前)

对。但是,GDB将仅在程序启动后变量值发生变化时停止,对于使用常量值初始化的变量,其设置为该值的时间是在程序启动之前

更准确地说:

int foo;
int bar = 42;
int baz = func();
变量
foo
.bss
部分中分配,并在执行过程中的第一条指令之前具有值
0

同样,变量
bar
.data
部分中分配,并且在第一条指令之前具有值
42
.data
部分中的相应位置在磁盘上具有该值,并且在进程开始之前将其简单地
mmap
插入进程)


变量
baz
.data
部分中分配,并被动态初始化——这是在流程启动后实际更改其值的唯一变量。您可以
监视该变量并观察初始化发生的位置,而无需在
func()
上设置断点
监视globalX
对我有效。执行此操作时会发生什么情况?设置了观察点,但在
run
之后,gdb不会在定义全局函数的行中停止:
int globalX=0
;如果全局初始化是一个常量值,那么在运行程序时不会设置这个值。它已经在可执行文件本身的全局变量部分写入了值。