我将gdb附加到进程并且只是在函数断点处停止。 不幸的是,由于映射似乎已关闭,我无法看到任何源代码。
它查找报告的文件为:../../qpy/QtCore/qpycore_chimera.cpp
,下载的源位于/home/user/debugging/pyqt5-5.4.2+dfsg/qpy/QtCore
。
无论我设置为源映射,它都不会打开文件。相对源映射的正确语法是什么?
答案 0 :(得分:0)
如果您不想为所有文件运行directory
gdb命令,那么我有一个适用于我的黑客。
如果源路径为../../qpy/QtCore/qpycore_chimera.cpp
,并且您已将源移至/home/user/debugging/pyqt5-5.4.2+dfsg/qpy/QtCore
,
然后尝试创建一些虚拟目录层次结构$ mkdir -p /home/user/debugging/dir_1/dir_2
并在gdb中运行directory /home/user/debugging/dir_1/dir_2
。
在gdb中,/home/user/debugging/dir_1/dir_2/
与../../qpy/QtCore/qpycore_chimera.cpp
串联在一起的方式就是/home/user/qpy/QtCore/qpycore_chimera.cpp
,这就是您想要的。
在其他更复杂的情况下,我确信符号链接会有所帮助(对于我的情况也是如此)。
参考: https://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html
例如,假设一个可执行文件引用了该文件 /usr/src/foo-1.0/lib/foo.c,我们的源路径是/ mnt / cross。的 首先从字面上查找文件;如果失败 尝试/mnt/cross/usr/src/foo-1.0/lib/foo.c;如果失败 /mnt/cross/foo.c已打开;如果失败,则显示错误消息 印刷。 GDB不会查找源文件名的一部分,例如 作为/mnt/cross/src/foo-1.0/lib/foo.c。同样,的子目录 不搜索源路径:如果源路径是/ mnt / cross, 并且二进制文件指向foo.c,GDB在以下位置找不到它 /mnt/cross/usr/src/foo-1.0/lib。
普通文件名,带有前导目录的相对文件名,文件 包含点等的名称均按上述方式处理;对于 例如,如果源路径为/ mnt / cross,并且源文件为 记录为../lib/foo.c,GDB将首先尝试../lib/foo.c,然后 /mnt/cross/../lib/foo.c,然后-/ mnt / cross / foo.c。