GDB源代码查找路径

摘要:
在gdb程序中,有时您会发现找不到源代码文件。对于具有调试信息的系统库或第三方库,很多时候,当您确实希望gdb使用其他源代码时,您会发现gdb根本找不到这些源代码路径。根据参考链接,应该设置此命令,以便gdb可以读取。可信路径的gdbinit。

在gdb程序的时候,有时候会发现源代码文件找不到,对于那些带调试信息的系统库或者第三方库,很多时候当你真正想gdb去追他源代码的时候你会发现gdb根本找不到这些源代码路径。这个时候有两种选择:

【1】如果gdb这个时候告诉你找不到这个带调试信息库的源文件路径,此时给出的路径地址是绝对路径,比如

/home/rickyk/qt-4.8.6/src/corelib/tools/qstring.cpp: 没有那个文件或目录

这种提示的,你就应该用gdb提供的

set substitute-path

这个其实很好理解,就是替换规则,你如果想查看当前的替换规则,你可以

show substitute-path

比如此时我们需要qstring.cpp这个文件,但由于某种原因,目前我们不能在/home/rickyk/qt-4.8.6/src/corelib/tools/qstring.cpp中找到,但我们确可以在/home/rickyk/qt-everywhere-opensource-src-4.8.6/src/corelib/tools/qstring.cpp中找到,我们就

set substitute-path /home/rickyk/qt-4.8.6 /home/rickyk/qt-everywhere-opensource-src-4.8.6

这是什么意思?其实就是让gdb在看到/home/rickyk/qt-4.8.6的时候他会做自动替换成/home/rickyk/qt-everywhere-opensource-src.4.8.6,也就是说gdb可以正确知道这个文件了。此时我们再show substitute-path可以看到此时的转换规则已经被我们加进去了

(gdb) show substitute-path 
List of all source path substitution rules:
  `/home/rickyk/qt-4.8.6' -> `/home/rickyk/qt-everywhere-opensource-src-4.8.6'.

【2】如果此时的gdb弹出的错误信息不是绝对路径的概念,而是相对路径的概念

./a.cpp 没有那个文件或目录

那么此时你可以用gdb的第二个源代码路径法宝----directory(dir) dirName来指定,也就是说如果我们此时的a.cpp不在当前目录下,而是在当前目录下的bak文件夹下,我们只要

dir bak

这个时候我们的gdb就会把你加进去的dir整个替换到相对路径的前面,自己做拼接,也就是说,现在的./a.cpp变成了./bak/a.cpp。

注意两者的差别,对于绝对路径来说,你需要给出替换规则给他做字符串替换,对于相对路径来说,你需要给他目录来让他做拼接,也有点prefix的意思,这里的prefix由你给出,但相对路径整体结构由gdb给出,然后完成拼接操作。

PS: 同时你需要在.gdbinit上加上一句

set auto-load safe-path /

这样你才能让gdb去正确的在别的目录进行读取源代码 。(这里面的原因我目前不是很清楚,总之就是我一开始使用set substitute-path的时候怎么用都不成功,加上这句之后才可以,有同学知道的也可以告诉我原因),我看了下auto-load的介绍

set auto-load safe-path [directories]
Set the list of directories (and their subdirectories) trusted for automatic loading and execution of scripts. You can also enter a specific trusted file. Each directory can also be a shell wildcard pattern; wildcards do not match directory separator - see FNM_PATHNAME for system function fnmatch (see fnmatch). If you omit directories, ‘auto-load safe-path’ will be reset to its default value as specified during gdb compilation.

The list of directories uses path separator (‘:’ on GNU and Unix systems, ‘;’ on MS-Windows and MS-DOS) to separate directories, similarly to thePATHenvironment variable.

感觉这是在设置自动可以读取的script路径,不知道这对于set substitute-pah有什么影响。按照参考链接的说法,设置这个命令应该是让gdb去读取可信赖路径的.gdbinit才对。

参考链接: http://stackoverflow.com/questions/16595417/loading-gdbinit-from-current-directory

                  https://vecr.ece.villanova.edu/vecr/doc/gdb/Auto_002dloading-safe-path.html

免责声明:文章转载自《GDB源代码查找路径》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇软件版本控制中的版本号快速重置vuex数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux/Unix下的任务管理器top命令

Windows下的任务管理器虽然不好用(个人更喜欢Process Explorer些),但也算方便,可以方便的查看进程,CPU,内存...也可以很容易的结束进程 没有图形化界面下的Linux,也有命令可以实现Windows的任务管理器功能,这个命令就是"top",用户可以使用top来对进程排序,结束进程等. top 命令是 Linux 下常用的性能分析工...

opencv视觉系统开发教程资料下载

opencv视觉系统开发教程资料下载 转 https://bbs.52iss.com/forum.php?mod=viewthread&tid=3995&extra=opencv对于编程绝对是一个好东西。opencv的意思是开放源代码计算机视觉类库(open source computer vision library),未来研究人工智能可...

GDB调试教程

简介   GDB(GNU debugger)是GNU开源组织发布的一个强大的UNIX下的程序调试工具。可以使用它通过命令行的方式调试程序。它使你能在程序运行时观察程序的内部结构和内存的使用情况。你也可以使用它分析程序崩溃前的发生了什么,从而找出程序崩溃的原因。相对于windows下的图形界面的VC等调试工具,它提供了更强大的功能。如果想在Windows下使...

chrom浏览器-F2使用方法一

   由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首先介绍Chrome开发者工具中,调试时使用最多的三个功能页面是:元素(ELements)、控制台(Console)、源代码(Sources),此外还有网络(Network)等。    元素(Elem...

arm gdb调试简述

arm gdb调试简述 编译、调试工具和平台 gcc-arm-none-eabigdb-arm-none-eabi,ubantu64位;网上有很多用nfs或者通过串口连接开发机和板子进行调试;这里用qemu的gnuarmeclipse模拟stm32f429的板子。 步骤 先在你的Makeflie的编译加上-g,这样生成的ELF文件里才有调试信息,否则只...

Linux程序调试GDB——数据查看

查看栈信息 当程序被停住了,首先要确认的就是程序是在哪儿被断住的。这个一般是通过查看调用栈信息来看的。在gdb中,查看调用栈的命令是backtrace,可以简写为bt。 (gdb) bt#0 pop () at stack.c:10#1 0x080484a6 in main () at main.c:12 也可以通过info stack命令实现类似的功能...