有没有办法在程序运行时更改linux上的发布代码中的成员变量?

时间:2011-05-21 20:05:18

标签: c++ linux gcc gdb

我写了一个解决某种优化问题的程序。我一直在以越来越低的阈值运行它,我认为我遇到了某种障碍,因为我的程序无法获得更好的结果。它已经运行了大约5天......

但是,我在程序中有一些代码,如果它比阈值更好,它会保存数据。由于我没有兴趣再运行它5天,我想在程序运行时这样做,但遗憾的是我没有使用-g编译它(我正在使用gcc)。我想要做的是将阈值更改为更高的值。

我确实设法使用gdb连接到它,并查看堆栈帧。我现在在一个方法中,我想访问“this”指针以更改阈值参数。我尝试检查函数地址周围的值,但没有任何意义...... 我如何找出“这个”所指的位置?

感谢。

1 个答案:

答案 0 :(得分:3)

首先,您无需重新启动程序即可对其进行调试。

您应该使用完全重建它,使用与原来添加-g相同的源和标记。这将为您提供包含调试信息的可执行文件,但在其他方面(几乎)与原始二进制文件相同。 nm a.outnm a.out.debug的输出应该非常接近(可能会出现一些细微差别,但可能不会影响调试)。现在运行gdb a.out.debug <pid>,您应该能够进行源级调试,并调整阈值。

如果失败了,你仍然可以做你想做的事情,但会更难:你必须在装配级别这样做。您可以运行a.out.debug(开始一项新任务),并在GDB disas输出参数如何传递给您的例程,以及如何访问阈值。然后,您可以返回到原始可执行文件,并观察与此相同的事情。一旦你知道阈值位于内存的哪个位置,你就可以在GDB中调整它。