GDB提示缺失raise.c文件,捕获异常时报错如何解决?
解决GDB捕获异常时提示找不到raise.c文件的问题
嘿,这个问题我之前也碰到过,确实有点闹心!其实这是因为GDB默认会尝试定位系统底层调用的源码,但你的系统里没装对应的调试符号和源码包,所以才会弹出这个找不到文件的错误。下面给你几个实用的解决办法:
1. 安装系统库的调试包
这是最彻底的解决方式,装上之后GDB就能找到系统函数的调试信息,不会再报错了:
- 如果你用的是Debian/Ubuntu系列发行版,执行这个命令:
sudo apt-get install libc6-dbg - 如果是RHEL/CentOS/Fedora系列,执行:
# RHEL/CentOS 7及以下 sudo yum install glibc-debuginfo # RHEL/CentOS 8+ 或 Fedora sudo dnf install glibc-debuginfo
2. 让GDB跳过系统源码文件
如果你不想装额外的包,可以直接告诉GDB不要去加载这些系统底层的源码文件:
- 在GDB会话里临时生效:
set skip-file-regexp ../sysdeps/unix/sysv/linux/.* - 想永久生效的话,把上面的命令添加到你的
~/.gdbinit文件里,下次启动GDB就自动生效了。
3. 提前捕获异常并查看信息,避免走到abort步骤
其实你可以在异常抛出时就查看信息,不用等程序触发SIGABRT:
- 启动GDB后先设置捕获异常:
catch throw - 运行程序,当GDB捕获到异常时,直接打印异常信息:
# 查看当前抛出的异常详情 info throw # 或者直接打印异常对象 print *$exception - 之后你可以选择
continue或者quit,不用让程序走到调用raise()的环节,自然也就不会出现找不到文件的错误了。
简单解释下背后的原因:当你的C++异常没有被捕获时,程序会调用terminate()函数,最终触发raise(SIGABRT)来终止程序。GDB会尝试显示raise()函数的源码,但因为缺少调试包,所以才会提示找不到raise.c文件。
内容的提问来源于stack exchange,提问作者ClausH
相关产品推荐
相关产品推荐

