在Linux上,在程序运行时是否有一种方法可以更改释放代码中的成员变量?

3
我写了一个解决某种优化问题的程序。我一直在使用越来越低的阈值运行它,但是我认为我遇到了某种障碍,因为我的程序无法获得更好的结果。它已经运行了大约5天...
然而,我的程序中有一些代码,如果数据比阈值更好,就会保存数据。由于我不想再运行5天,所以我想在程序运行时完成它,但不幸的是我没有使用-g编译它(我正在使用gcc)。我想要做的是将阈值更改为更高的值。
我确实设法使用gdb连接到它,并查看堆栈帧。现在我在一个方法内部,我想要访问“this”指针以更改阈值参数。我尝试检查函数地址周围的值,但是没有任何意义...如何找出“this”指向哪里?
谢谢。

在你的Makefile中加入-g :-) 你可能需要考虑添加检查点,例如定期写出程序状态,以便可以从保存的状态轻松地重新启动优化。 - Andre Holzner
这其实是我一开始就应该做的事情...而且我也没有问题去更改程序以便定期写入状态。唯一的问题是我没有5天的时间等待它再次达到相同的状态,所以如果可能的话,我更喜欢在运行中的程序中进行此操作。 - barisdad
1个回答

3

首先,您不需要重新启动程序以调试它。

您应该使用与最初相同的源和标志进行重建,并添加-g。这将为您提供包含调试信息但否则(几乎)与原始二进制文件相同的可执行文件。从nm a.outnm a.out.debug的输出应该非常接近(可能存在一些次要差异,但不太可能影响调试)。现在运行gdb a.out.debug <pid>,您应该能够进行源级调试并调整阈值。

如果失败了,您仍然可以做您想做的事情,但会更难:您将不得不在汇编级别上进行操作。您可以运行a.out.debug(启动新任务),并在GDB中查看disas输出,了解参数如何传递给您的例程,以及如何访问阈值。然后您可以返回到原始可执行文件,并观察基本上发生在那里的相同事情。一旦您知道阈值在内存中的位置,就可以在GDB中进行调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接