首页 > 解决方案 > 您如何正确使用 gdb `set substitution-path` 和 ../ 开头的引用?

问题描述

我正在对核心文件进行事后调试。构建完成后,源代码的位置在核心中被引用为 ../../../../../_vcs。我将源代码放在 /_vcs 中(即在根目录下)。但是,我无法让set substitute-pathgdb 命令工作。这应该如何调用?

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

标签: c++gdb

解决方案


也许这不是在所有情况下都有效的解决方法,但我碰巧有一个目录,它在源代码树中的深度与编译原始二进制文件的深度一样。(如果我没有这样的目录,我可以已经做了一个。)因此,我将gdb命令用于cd编译路径../../foo/bar/file.cpp实际上可以找到代码的位置。

此时 gdb 命令list正确显示了源代码。


推荐阅读