如何在更改时调试可执行文件
How can an executable file being debugged while it changes
这是我要问的场景:
gdb
调试一些可执行程序
- 程序员发现 bug(好!)
- 程序员修复代码并重新编译(太棒了!)
- 程序员意识到他没有退出 gdb,所以一直 运行
- 具体来说,是 运行 在编写可执行文件时 并且 OS (Linux) 允许它。
以上怎么可能?
我不应该收到一些 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.$uniqsuffix
和rename(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 了解为什么即使在重建原始程序后仍可以继续调试它。
这是我要问的场景:
gdb
调试一些可执行程序- 程序员发现 bug(好!)
- 程序员修复代码并重新编译(太棒了!)
- 程序员意识到他没有退出 gdb,所以一直 运行
- 具体来说,是 运行 在编写可执行文件时 并且 OS (Linux) 允许它。
以上怎么可能?
我不应该收到一些 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.$uniqsuffix
和rename(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 了解为什么即使在重建原始程序后仍可以继续调试它。