GDB没有这个文件或目录。

15

我正在跟随OpenSecurityTraining的课程。

我已经到达实验室部分,需要在CMU Bomb上进行自我训练。他们提供了一个x86_64编译的CMU Bomb,您可以在此处找到:CMU Bomb x86-64,最初是来自CMU计算机系统实验室:程序员的视角(CS:APP)第1版32位炸弹。

我有一个虚拟化的64位Elementary OS发行版,在使用GDB时没有遇到任何问题就反汇编了CMU Bomb。现在,我有一个64位Ubuntu 14.04 LTS(非虚拟化),当我尝试复制我在Elementary OS上所做的操作时,我遇到了著名的错误。

我运行以下命令:

gdb ./bomb-x64
(gdb) b main
Breakpoint 1 at 0x400dbd: file bomb.c, line 37. -- why bomb.c ?
(gdb) r
...
bomb.c: no such file or directory

编辑:我可以在CMU炸弹的其他函数上创建断点,并且它按预期工作。
例如:

(gdb) b phase_1
Breakpoint 3 at 0x400f00
(gdb) r

Breakpoint 1, 0x0000000000400f00 in phase_1 ()
(gdb) disas
Dump of assembler code for function phase_1:
=> 0x0000000000400f00 <+0>: sub    $0x8,%rsp
   0x0000000000400f04 <+4>: mov    $0x4023b0,%esi
   0x0000000000400f09 <+9>: callq  0x401308 <strings_not_equal>
   0x0000000000400f0e <+14>:    test   %eax,%eax
   0x0000000000400f10 <+16>:    je     0x400f17 <phase_1+23>
   0x0000000000400f12 <+18>:    callq  0x40140a <explode_bomb>
   0x0000000000400f17 <+23>:    add    $0x8,%rsp
   0x0000000000400f1b <+27>:    retq   
End of assembler dump.

我听说过ia32-libs,但由于我使用的是64位Ubuntu并运行64位编译的CMU Bomb,所以它并没有起到更多作用,我错了吗?


1
看起来你的bomb.c文件不在gdb的源路径中。你需要使用“directory”命令。请参见https://dev59.com/wuo6XIcBkEYKwwoYKQ_G。 - Fred Larson
1
当出现错误时,如果输入“disas”,或者无法执行该命令,尝试使用“next”会发生什么? - Tony
@FredLarson 我没有源代码。这是实验/练习的目的。这是有意为之的。但是,我可以在其他函数上添加断点,它可以按预期工作。只有break main引用源文件。 - Cédric M.
@Tony 我一回家就尝试一下。 - Cédric M.
2
我在64位的Ubuntu 14.04下下载并在gdb中运行了它。除了周期性的bomb.c: No such file or directory提示外,它正常运行。在使用b mainrun之后,我得到了Starting program: /var/tmp/bomb-x64Breakpoint 1,main (argc=1, argv=0x7fffffffe088) at bomb.c:3737 bomb.c: No such file or directory.(gdb)等信息。键入c允许它正常进行欢迎消息。你发现有什么不同吗? - Mark Plotnick
3个回答

19

使用 dir 命令设置源路径

dir /usr/src/debug
在上述路径中,你的代码应该呈现出来。

15
您应该详细阐述。 - Surajeet Bharati
完美的答案 :) - RahulAN
它是否进行递归搜索? - keyur

9
可执行文件包含调试符号,这些符号指示每个汇编代码位对应的文件(以及文件中特定的行)。这是允许你在调试器中逐步执行 C 代码的原因。调试符号是由编译器放置的(例如,通过使用 gcc 的 -g 参数)。
如果您没有用于编译可执行文件的 C 文件,则调试器将无法向您显示 C 代码,您只能查看汇编代码。

我确实想查看汇编代码,但由于断点 main 引用了我没有的源文件,所以我无法查看。我想提醒您,这个错误只在我的 Ubuntu 上出现。在我(虚拟化的)Elementary OS 上没有这个错误。 - Cédric M.

-1
(gdb) list 
/home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/tasks.c: No such file or directory.
(gdb) set substitute-path /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/ C:/Espressif/frameworks/esp-idf-v4.4/  
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接