如何在更改时调试可执行文件

How can an executable file being debugged while it changes

这是我要问的场景:

以上怎么可能?

我不应该收到一些 OS 错误消息,例如 "file is being used by another application (gdb)"

Shouldn't I get some OS error message like

视情况而定。

假设您的重建命令是 gcc -o foo t.c

这个命令既可以open(2)foo,也可以写到临时文件foo.$uniqsuffixrename(2)临时到foo上成功,或者它可以 unlink(2) foo 并创建并写入新的 foo.

只有第一个变体 -- 尝试写入 原始 foo 会失败 ETXTBSY

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

[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+创建新文件的策略,预计没有错误。

请参阅 this answer 了解为什么即使在重建原始程序后仍可以继续调试它。