我试图找出一种方法,通过使用GDB反向调试的程序中的函数调用和变量副本来传播值。我过去经常使用GDB,但反向调试相对较新。
我认为用一个例子来构建问题是最容易的。看一下这个程序。
void FnA(int x) {
printf("x=%d\n", x)
}
void FnB(int y) {
int y_copy = y;
FnA(y_copy);
}
void FnC(int z) {
FnB(z);
}
int main() {
int i;
i = 5;
FnC(i);
}
我编译程序,然后使用反向调试启动GDB以运行已编译的可执行文件。我在printf
的{{1}}设置断点,然后让程序开始执行,这会导致我达到该断点。从这里开始,我想回答一个问题“FnA
被写入的最后一次在哪里?”我可以x
然后watch -l x
。但是,这只会把我带到reverse-continue
的开头,因为那是FnA
在堆栈中开始生命的地方。我真正感兴趣的是x
在i = 5
中一直分配,因为这是main
的价值所在。从x
发生的时间开始,i = 5
的值实际上只是通过函数参数和变量副本传播,如下所示:x
。
显然,我可以通过一些GDB-fu结合人类的直觉来解决这个问题,但我试图让这个过程尽可能自动化。我最终想在更复杂的软件中尝试这一点,使用人类直觉和GDB-fu会相当繁琐。
有没有一种方便的方法可以在GDB中通过反向调试实现这一目的? GDB是否能够自动计算和跟踪这些价值传播?
PS:具体来说,我实际上正在使用带有rr的GDB。 rr只是gdb的一个包装器,允许确定性和可重现的执行上下文。我认为/希望核心问题保持不变,无论我是否使用带有或不带rr的gdb。