为何GDB无法通过标准输入读取文件?异常问题求助
GDB调试时无法通过重定向读取标准输入的问题
环境信息
- 系统:VMware 17 Pro 搭载 Ubuntu 22.04
- GDB版本:
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1 - 编译命令:
gcc t.c -o t -m32 -g
代码与测试文件
t.c 源代码
#include <stdio.h> int main() { char buffer[100]; printf("Please enter a string: "); scanf("%99s", buffer); printf("You entered: %s\n", buffer); return 0; }
t.txt 内容
123
终端运行正常
通过管道或标准输入重定向在终端运行程序时,功能完全正常:
muyigin@ysyx:~/Desktop$ cat t.txt | ./t Please enter a string: You entered: 123 ============================================ muyigin@ysyx:~/Desktop$ ./t < t.txt Please enter a string: You entered: 123
GDB调试异常
但在GDB中调试时,程序无法读取t.txt的输入,停留在Please enter a string:提示后无响应:
(gdb) file t (gdb) run < t.txt Starting program: /home/muyigin/Desktop/t1 < t.txt [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Please enter a string:
已尝试的无效操作
试过以下所有命令,问题均未解决:
(gdb) run < t.txt (gdb) r < t.txt (gdb) r < $(cat t.txt) (gdb) r < /home/muyigin/Desktop/t.txt (gdb) r < ~/Desktop/t.txt (gdb) start < t.txt
同时尝试过设置断点,依旧无法读取输入。
解决方案
1. 修正GDB重定向的语法
GDB中正确的输入重定向写法需要用set args指定,或者明确用--args分隔程序参数:
# 方法1:用set args预先设置输入重定向 (gdb) file t (gdb) set args < t.txt (gdb) run # 方法2:用--args参数传递重定向 (gdb) run --args ./t < t.txt
2. 解决输出缓冲问题
程序中的printf在调试环境下可能因为行缓冲机制导致输出不及时,进而让你误以为输入未被读取。修改代码添加强制刷新:
#include <stdio.h> int main() { char buffer[100]; printf("Please enter a string: "); fflush(stdout); // 强制刷新输出缓冲区 scanf("%99s", buffer); printf("You entered: %s\n", buffer); return 0; }
重新编译后再调试,就能看到输入被正常读取的完整流程。
3. 检查程序路径正确性
注意到GDB输出中启动的程序是/home/muyigin/Desktop/t1,但你编译的程序是t,可能是文件名输入错误。确保加载正确的程序:
(gdb) file ./t (gdb) run < t.txt
4. 使用starti启动调试
如果start命令无效,尝试用starti从程序第一条指令开始执行,配合重定向:
(gdb) starti < t.txt
内容的提问来源于stack exchange,提问作者Gin muyi
相关产品推荐
相关产品推荐

