如何通过GDB反向调试的函数调用来跟踪值传播?

时间:2016-09-09 16:47:59

标签: c debugging gdb dynamic-analysis reverse-debugging

我试图找出一种方法,通过使用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在堆栈中开始生命的地方。我真正感兴趣的是xi = 5中一直分配,因为这是main的价值所在。从x发生的时间开始,i = 5的值实际上只是通过函数参数和变量副本传播,如下所示:x

显然,我可以通过一些GDB-fu结合人类的直觉来解决这个问题,但我试图让这个过程尽可能自动化。我最终想在更复杂的软件中尝试这一点,使用人类直觉和GDB-fu会相当繁琐。

有没有一种方便的方法可以在GDB中通过反向调试实现这一目的? GDB是否能够自动计算和跟踪这些价值传播?

PS:具体来说,我实际上正在使用带有rr的GDB。 rr只是gdb的一个包装器,允许确定性和可重现的执行上下文。我认为/希望核心问题保持不变,无论我是否使用带有或不带rr的gdb。

0 个答案:

没有答案