Gdb 当可执行文件发生更改时,如何调试该文件

Gdb 当可执行文件发生更改时,如何调试该文件,gdb,executable,Gdb,Executable,下面是我要问的场景: gdb调试一些可执行程序 程序员发现bug很好! 程序员修复代码和重新编译伟大! 程序员意识到他并没有退出gdb,所以它一直在运行 具体地说,它是在编写可执行文件时运行的,操作系统Linux允许这样做。 为什么会出现上述情况 我是否应该得到一些操作系统错误消息,比如文件正被另一个应用程序gdb使用 我不应该收到一些操作系统错误消息吗 视情况而定 假设您的rebuild命令是gcc-ofoot.c 此命令可以打开2 foo进行写入,也可以写入临时文件foo.$uniqsuff

下面是我要问的场景:

gdb调试一些可执行程序 程序员发现bug很好! 程序员修复代码和重新编译伟大! 程序员意识到他并没有退出gdb,所以它一直在运行 具体地说,它是在编写可执行文件时运行的,操作系统Linux允许这样做。 为什么会出现上述情况

我是否应该得到一些操作系统错误消息,比如文件正被另一个应用程序gdb使用

我不应该收到一些操作系统错误消息吗

视情况而定

假设您的rebuild命令是gcc-ofoot.c

此命令可以打开2 foo进行写入,也可以写入临时文件foo.$uniqsuffix并在成功时将临时文件重命名为foo,或者可以取消2 foo的链接并创建和写入新的foo

只有第一个变量-尝试写入原始的foo会因ETXTBSY而失败

在我的Ubuntu系统上运行strace-fe文件gcc-o foo t.c |&grep foo显示:

[pid 116892] stat("foo", {st_mode=S_IFREG|0750, st_size=16520, ...}) = 0
[pid 116892] lstat("foo", {st_mode=S_IFREG|0750, st_size=16520, ...}) = 0
[pid 116892] unlink("foo")              = 0
[pid 116892] openat(AT_FDCWD, "foo", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
[pid 116892] stat("foo", {st_mode=S_IFREG|0640, st_size=16520, ...}) = 0
[pid 116892] chmod("foo", 0750)         = 0
因此,在这个系统上,链接器使用unlink+createnewfile策略,不会出现错误

请参阅,以了解即使在重建原始程序后仍可以继续调试该程序的原因。

请参阅。