如何解决GDB退出main函数时提示指定头文件不存在的问题
解决GDB调试退出main后提示“../sysdeps/nptl/libc_start_call_main.h: No such file or directory”的问题
调试日志复现
Breakpoint 1, main () at 1.cpp:6 6 cout << "hello world" << endl; (gdb) n hello world 7 return 0; (gdb) n 9 } (gdb) n __libc_start_call_main (main=main@entry=0x5555555551a9 <main()>, argc=argc@entry=1, argv=argv@entry=0x7fffffffe348) at ../sysdeps/nptl/libc_start_call_main.h:74 74 ../sysdeps/nptl/libc_start_call_main.h: No such file or directory.
问题本质
这个报错不是你的C++程序存在bug,而是GDB尝试调试glibc的启动收尾代码时,找不到对应的源码头文件。当main函数执行完毕返回后,程序会进入glibc的__libc_start_call_main函数做进程收尾工作,此时继续用n单步执行,GDB会尝试加载该函数的源码文件,但系统未安装glibc的调试源码包,因此出现文件缺失提示。
解决方案1:安装glibc调试源码包
根据Linux发行版执行对应命令:
- Debian/Ubuntu 系列:
sudo apt install libc6-dbg glibc-source - RHEL/CentOS/Rocky Linux 系列:
sudo yum install glibc-debuginfo glibc-debuginfo-common
安装完成后重启GDB,即可正常查看__libc_start_call_main的源码,不会再出现文件找不到的报错。
解决方案2:跳过系统库的调试(无需安装包)
若不需要调试glibc内部代码,直接跳过即可:
- 在GDB中执行
finish命令,直接结束当前main函数的执行,避免进入libc收尾代码; - 或设置GDB自动跳过系统库文件:
set skip-file-regexp ../sysdeps
之后再用n单步时,GDB会自动跳过这些系统库文件,不再触发报错。
内容的提问来源于stack exchange,提问作者lanxu yang
相关产品推荐
相关产品推荐

