使用GDB调试时execve执行后可执行文件被替换的疑问
这是GDB的特性,不是Bug
你的代码里调用了execve("/usr/bin/env", argv, NULL),这个系统调用的核心作用就是用新程序完全替换当前进程的内存空间——包括代码段、数据段、堆栈等,但进程ID保持不变。
在GDB调试时:
- 第一次输入
r,GDB启动并调试a.out,当execve执行成功后,GDB会自动跟踪这个被替换后的进程(因为PID没变化),同时会将当前调试的目标程序更新为/usr/bin/env。 - 当你再次输入
r时,如果没有明确指定要运行的程序路径,GDB就会默认使用最后一次调试的目标程序,也就是/usr/bin/env。
如果想每次都重新运行原始的a.out,可以在r命令后明确指定程序路径:
run ./a.out
内容的提问来源于stack exchange,提问作者Harry Potter
相关产品推荐
相关产品推荐

