gdb不能看源文件

gdb不能看源文件

我们用gdb调试的时候,可能遇到gdb无法打断点gdb不能看源文件gdb不能单步调试等诸如此类问题,非常让人头疼...

这种问题可能有很多种原因,今天就几种常见的情况来做个总结,后面遇到了再补充,如果您发现了其他场景,欢迎评论区补充。

一、打断点方式

先来说一下给程序打断点的方式:

  1. b test.cpp:127 //在test.cpp的127行打断点

  2. b Test::func(int, int*) //在Test::func处打断点(由于C++支持重载,所以必须指定参数列表类型)

  3. b Test<int>::func(int, int*) //如果是模板类,必须指定模板类型

  4. b NameSpace::Test::func(int, int*) //如果有自定义的namespace,必须手动指定

提示:以上指令在输入过程中都可以按TAB自动补全。

二、错误提示

遇到问题时,可能出现如下此类的错误提示:

Reading symbols from /home/XX/XX...(no debugging symbols found)...done.
No source file named file.c. 
Make breakpoint pending on future shared library load? (y or [n]) n 
gdb single stepping until exit from function *, which has no line number information

三、错误原因及解决办法

3.1 没有加-g

这是最常见的情况,八成是这个原因。

如果你是用的gcc/g++命令直接编译的,直接加-g选项即可,像这样:

gcc -g test.c -o test

如果你用的是Makefile,那你需要去找里面的编译选项,一般是CFLAGS/CXXFLAGS这种名字,在里面加上-g,像这样:

CXX_FLAGS = -g -fPIC -finline-functions -Wall -Winline -pipe

如果你用的是cmake,那你需要去CMakelists.txt里找对应的编译选项变量,像这样:

SET(CMAKE_CXX_FLAGS "-g -fPIC -finline-functions -Wall -Winline -pipe")

SET(CMAKE_CXX_FLAGS_DEBUG "-g -fPIC -finline-functions -Wall -Winline -pipe")

3.2 执行环境上没有源文件

如果你的程序是在一台机器上编译,另一台机器上执行,那可能会出现这种问题,因为执行文件中并不含源代码,只有源代码的路径信息,所以必须要在执行环境,即调试环境上对应路径下有源代码才可以。如果有权限,直接把源代码拷贝过来就可以(注意放的路径一定要跟编译环境一样)。如果没权限,那就没招儿了,巧妇难为无米之炊。

这种情况还适用于各种系统库或者三方库,如果你要调试的部分不是你写的,你看不到源代码,那肯定是没办法调试的,就别费劲了。

3.3 gcc gdb版本不匹配

这个是看到别人博客写的,自己没遇到过,写在这里以备查询。

3.4 -fvisibility=hidden以及-Wl,-Bsymbolic

添加上面的编译选项可能导致问题,也是别人博客看到的。

3.5 多个库相互链接导致的问题

这种问题一般是出现在工程中,项目结构比较复杂的时候。也就是你最后使用的库可能不是用-g编译出来的库,什么情况会出现这种问题呢?如果你编译了一个A.a 然后 B.a链接了A.a 最后A.a 跟B.a 又都被C.a链接...这个时候就会到导致有好多个A.a的版本。如果你之前编译的是Release版本的A.a,后面想调试,改编了Debug版本,但这个时候B.a C.a中的版本并没有更新。而链接顺序不合理又导致最后真正用的不是A.a中的版本,所以就出现了非常奇怪的现象:明明编译的是debug版本,最后gdb却没办法使用。

这种情况比较难搞,需要根据具体的情况排查,常见的辅助定位的指令有:

nm + grep 查看一个库里的符号,比如 nm -A C.a | grep xxx

ar -x 拆分一个库,比如 ar -x libxxx.a

最后如果实在分析不出来,就把所有库全部都重新编译一遍debug版本的,全部替换就可以了。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: • 它使你能监视你程序中变量的值. • 它使你能设置断点以使程序在指定的代码行上停止执行. • 它使你能一行行的执行你的代码. 在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容:
在Windows下使用gdb进行调试,你可以使用Dev-C++来编写程序并进行测试。Dev-C++自带gdb.exe文件,所以你只需要在安装目录中找到gdb.exe可执行文件,并进行环境变量配置。配置环境变量后,你就可以在命令行中使用gdb命令进行调试了。\[1\] 另外,你也可以使用其他工具来进行C/C++调试,比如Visual Studio和VisualGDB等。这些工具提供了更多的调试功能和图形化界面,方便你进行代码调试和错误排查。\[2\] 在使用gdb进行调试时,你可以在编译时加上-g选项,这样会在目标文件中加入源代码的信息,方便调试时查看源代码和机器指令的对应关系。但需要注意的是,调试时需要保证gdb能够找到源文件。你可以参考相关教程来了解详细的步骤和指令。\[3\] 总的来说,在Windows下使用gdb进行调试需要配置环境变量,并在编译时加上-g选项来生成调试信息。然后你可以使用gdb命令进行调试,或者使用其他工具来进行更方便的调试操作。 #### 引用[.reference_title] - *1* *3* [在Windows下进行gdb调试](https://blog.csdn.net/ZT7524/article/details/81869807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [windows下C++程序gdb调试的几种方法](https://blog.csdn.net/ljsant/article/details/127484763)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值