我正在对核心文件进行事后调试。构建是这样完成的,源代码的位置被引用为 ../../../../../_vcs在核心中。我将源代码放在/_vcs 中(即根目录)。但是,我无法使set substitute-path
gdb命令工作。应该如何调用它?
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Copyright (C) 2013 Free Software Foundation, Inc.
...
Program terminated with signal 6, Aborted.
#0 0x00007f9f6fd37207 in raise () from /lib64/libc.so.6
(gdb) f 2
#2 0x000000000042c585 in SignalHandler (sig=11) at ../../../../../_vcs/trafficserver9/src/traffic_manager/traffic_manager.cc:935
935 ../../../../../_vcs/trafficserver9/src/traffic_manager/traffic_manager.cc: No such file or directory.
(gdb) set substitute-path ../../../../../ /
(gdb) l
930 ../../../../../_vcs/trafficserver9/src/traffic_manager/traffic_manager.cc: No such file or directory.
(gdb) set substitute-path ../../../../../_vcs /_vcs
(gdb) l
930 ../../../../../_vcs/trafficserver9/src/traffic_manager/traffic_manager.cc: No such file or directory.
(gdb) quit
-bash-4.2$ ls /_vcs/trafficserver9/src/traffic_manager/traffic_manager.cc
/_vcs/trafficserver9/src/traffic_manager/traffic_manager.cc
请注意,在我手动将../../../../../_vcs
替换为/_vcs
后,我可以在指定位置列出文件。我做错了什么?我必须逃离部分路径吗?
(作为旁注,我可以通过cd /
解决此问题。然后间接../
引用停止在/处,我可以访问该目录。但在我看来,set substitute-path
也应该解决这个问题。
也许这不是在所有情况下都有效的解决方法,但我碰巧在源代码树中有一个目录,该目录与原始二进制文件编译的目录一样深。 (如果我没有这样的目录,我可以做一个。 因此,我使用gdb
命令cd
编译路径../../foo/bar/file.cpp
实际可以找到代码的位置。
此时,gdb 命令list
正确显示源。