使用cgdb调试含getchar()的C程序时阻塞,gdb无此问题
CGDB调试
getchar()时输入后卡住的解决办法 问题场景
我有一段简单的C代码(test.c):
#include<stdio.h> int main() { int myChar; myChar = getchar(); printf("You entered: %c\n", myChar); return 0; }
按以下步骤用CGDB调试:
$ gcc -g test.c $ cgdb a.out
执行调试命令后出现异常:
- 输入
start启动调试 - 输入
n单步到myChar = getchar();行 - 再次输入
n,输入字符'A'回车后,程序卡在getchar()处无响应,但用GDB调试完全正常。
CGDB输出如下:
(gdb) start Temporary breakpoint 1 at [34m0x1169[m: file [32mtest.c[m, line 3. Starting program: /home/test/code/a.out Temporary breakpoint 1, [33mmain[m () at [32mtest.c[m:3 3 int main(){ (gdb) n 6 myChar = getchar(); (gdb) n A
原因及解决方法
原因
CGDB作为GDB的前端,将终端拆分为代码显示区和调试命令区,程序的标准输入默认不与调试命令区共享,直接在命令区输入的内容无法被getchar()捕获,导致程序卡住。
解决步骤
- 当程序卡在
getchar()等待输入时,按下Ctrl+Z切换到程序运行的终端窗口(标准输入输出窗口) - 在该窗口输入字符'A'并回车
- 再次按下Ctrl+Z切回CGDB调试命令窗口,输入
n继续单步执行,程序会正常推进到printf语句。
替代方案
启动CGDB时添加--fullname参数,或直接用run命令启动程序,待程序等待输入时切换到终端窗口输入内容,也可避免该问题。
内容的提问来源于stack exchange,提问作者Aqiu
相关产品推荐
相关产品推荐

