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

标签 c++ linux gcc gdb

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

但是,我在程序中有一些代码可以在数据好于阈值时保存它的数据。因为我没有兴趣再次运行它 5 天,所以我想在程序运行时执行它,但遗憾的是我没有使用 -g 编译它(我使用的是 gcc)。我想做的是将阈值更改为更高的值。

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

谢谢。

最佳答案

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

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

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

关于c++ - 有没有办法在程序运行时更改 linux 上发布代码中的成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084142/

相关文章:

c++ - 有助于理解函数对象的工作原理?

c - Mac 上架构 x86_64 错误的 undefined symbol

c - 使用 OpenMP 停止 GCC 自动矢量化

linux - 如何在运行时获取内核模块的完整依赖列表

c++ - gcc/diab : keep unused function/sections

c++ - 指向 C 字符串的指针?

C++ 及其类型系统 : How to deal with data with multiple types?

c++ - 渲染调用性能消耗

sql - 为什么 rlwrap 回显 "redundantly"我从键盘输入的内容?

linux - 安装的 .desktop 文件插入用户的主目录路径