GDB调试汇编作业时重复出现“Program timed out after 5 seconds”问题排查
GDB绝对不是只能运行一次!你遇到的问题是bufbomb程序本身的超时检测机制和GDB调试时的输入交互冲突导致的,和GDB的核心功能无关。下面给你几个实用的解决办法:
问题根源
bufbomb会在等待用户输入测试字符串时设置严格的超时限制(默认5秒)。第一次调试时你在断点处停留,输入时机匹配程序预期;但第二次启动时,可能因为GDB的输入缓冲区残留、终端关联异常等问题,导致程序误判为用户未及时输入,直接触发超时退出。
解决方法
1. 强制绑定终端输入(快速修复)
在GDB中执行以下命令,让调试的程序直接关联当前终端作为输入源,避免输入通道异常:
set inferior-tty /dev/tty
之后再正常启动程序:
run -u 2014-14459
这样程序就能正常等待你手动输入字符串,不会无故触发超时。
2. 提前准备输入文件(推荐方案)
把你要测试的溢出payload写入一个文件,比如payload.txt,然后在GDB中用重定向启动程序,彻底跳过手动输入的等待环节:
run -u 2014-14459 < payload.txt
这个方法特别适合缓冲区溢出调试,你可以反复修改payload文件内容,快速验证调试效果,完全避开超时限制。
3. 清理残留进程
有时候程序异常退出后会留下僵尸进程,干扰后续运行。先退出GDB,在终端执行:
ps aux | grep bufbomb
找到相关进程的ID(pid),然后强制杀掉:
kill -9 <pid>
重新启动GDB后再尝试运行程序,大概率能恢复正常。
4. 修改程序禁用超时(需源码支持)
如果你能拿到bufbomb的源代码,找到超时检测的代码段(比如检查时间差的逻辑),注释掉或者把超时时间改长(比如改成300秒),重新编译后再调试,就能彻底解决超时问题。
你的调试会话记录
(gdb) run -u 2014-14459 //首次运行成功
Starting program: /home/devel/Desktop/lab/seokyoung-kook/buflab-handout/bufbomb -u 2014-14459
Userid: 2014-14459
Cookie: 0x3beba64f
Breakpoint 1, 0x08048db0 in getbuf ()
(gdb) s
Single stepping until exit from function getbuf, which has no line number information.
Program timed out after 5 seconds
Type string:[Inferior 1 (process 2794) exited with code 01]
(gdb) s
The program is not being run.
(gdb) s
The program is not being run.
(gdb) run -u 2014-14459 //第二次尝试
Starting program: /home/devel/Desktop/lab/seokyoung-kook/buflab-handout/bufbomb -u 2014-14459
Userid: 2014-14459
Cookie: 0x3beba64f
Program timed out after 5 seconds //未运行
Type string:[Inferior 1 (process 2797) exited with code 01]
(gdb) run -u 2014-14459 //第三次尝试
Starting program: /home/devel/Desktop/lab/seokyoung-kook/buflab-handout/bufbomb -u 2014-14459
Userid: 2014-14459
Cookie: 0x3beba64f
Program timed out after 5 seconds //未运行
Type string:[Inferior 1 (process 2798) exited with code 01]
(gdb) s
The program is not being run.
内容的提问来源于stack exchange,提问作者Seokyoung Kook




