Linux 如何在gdb中运行二进制文件时对其进行修改

Linux 如何在gdb中运行二进制文件时对其进行修改,linux,gdb,Linux,Gdb,Edit:实际问题在于二进制文件的更新方法,而不是由于gdb的问题。有关详细信息,请参见下面的答案。 原始问题: 最近,当gdb运行程序并在断点处停止时,我无法再编译程序。再次尝试写入二进制文件将导致“文本文件忙”错误 这是在Ubuntu 16.04 LTS 64位内核4.4.0-75上实现的 我不认为我在寻找正确的东西,因为一些搜索“gdb文本文件繁忙”或类似的搜索并没有产生任何结果。gdb手册特别提到了这种行为(在运行gdb时再次编译)是受支持的,事实上我以前已经做过很多次了 如果您能提供任

Edit:实际问题在于二进制文件的更新方法,而不是由于gdb的问题。有关详细信息,请参见下面的答案。

原始问题:

最近,当gdb运行程序并在断点处停止时,我无法再编译程序。再次尝试写入二进制文件将导致“文本文件忙”错误

这是在Ubuntu 16.04 LTS 64位内核4.4.0-75上实现的

我不认为我在寻找正确的东西,因为一些搜索“gdb文本文件繁忙”或类似的搜索并没有产生任何结果。gdb手册特别提到了这种行为(在运行gdb时再次编译)是受支持的,事实上我以前已经做过很多次了


如果您能提供任何关于发生了什么变化以及如何防止这种情况发生的建议,我们将不胜感激。

一些进一步的搜索表明,这篇优秀的文章解释了更新二进制文件的方法与此相关。在这种情况下,生成系统正在使用
cp a b
复制二进制文件,这将失败
cp-f a b
将删除b,然后用a覆盖,允许gdb在将新二进制写入磁盘时继续调试旧二进制。

“运行gdb时”与“目标进程存在时”不同。您是否尝试在终止目标后重新编译(但保持GDB打开)?并且
GDB
手册专门讨论了它--“如果您希望重新编译和重新链接程序,kill命令也很有用,因为在许多系统上,当可执行文件在进程中运行时,不可能修改它。在本例中,当您下次键入run时,GDB会注意到文件已更改,并再次读取符号表(同时尝试保留当前断点设置)。“@BenVoigt如果我先终止进程或以其他方式终止它,那么我就可以写入二进制文件。然而,这个问题的要点是,在运行二进制文件时修改二进制文件是可以正常工作的。在这种情况下,当我再次运行gdb时,会按预期重新加载符号。现在您了解了发生的事情,应该修复问题的标题。好主意@BenVoigt,我已经更新了标题,并为问题添加了一些信息。