首页 > 解决方案 > gdb - 观察全局变量

问题描述

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

int Init()
{
    return 0;
}

int globalX = Init();

//gdb: break Init
//gdb: run
//gdb: awatch globalX

是否可以在不定义函数断点的情况下观察全局变量(在主函数开始之前)?watch globalX不起作用。

标签: gdb

解决方案


是否可以在不定义函数断点的情况下观察全局变量(在主函数开始之前)?

是的。但是,只有在程序启动后变量的值发生变化时,GDB才会停止,而对于使用常量值初始化的变量,它设置为该值的时间是程序启动之前。

更确切地说:

int foo;
int bar = 42;
int baz = func();

该变量foo在段中分配,并且在进程中的第一条指令执行之前.bss具有值。0

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

该变量baz在该部分中分配.data,并被动态初始化——这是唯一在进程启动后实际更改其值的变量。您可以watch使用该变量并观察初始化发生的位置,而无需在func().


推荐阅读