【问题标题】:GDB no such file or directoryGDB 没有这样的文件或目录
【发布时间】:2015-03-07 04:05:16
【问题描述】:

我正在学习OpenSecurityTraining 的这些课程。

我已经到了实验室部分,我必须在 CMU 炸弹上训练自己。他们提供了一个 x86_64 编译的 CMU Bomb,您可以在此处找到用于训练的:CMU Bomb x86-64,最初来自 CMU Labs for Computer Systems: A Programmer's Perspective (CS:APP) 1st edition 的 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 Bomb 的其他功能上创建断点,它可以按预期工作。
示例:

(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,所以这并没有什么作用,我错了吗?

【问题讨论】:

  • 您的 bomb.c 文件似乎不在 gdb 的源路径中。您需要使用“目录”命令。见stackoverflow.com/q/21928876/10077
  • 当错误发生时,如果您输入disas 或输入next 会发生什么?
  • @FredLarson 我没有消息来源。这是本次实验/练习的重点。这是故意的。但是,我可以在其他函数上添加断点,它可以按预期工作。只有 break main 引用源文件。
  • @Tony 我一到家就试试这个。
  • 我下载了它并在 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 允许它正常进入欢迎消息。你看到了什么不同的东西吗?

标签: c linux debugging assembly gdb


【解决方案1】:

使用dir命令设置源路径

dir /usr/src/debug

在上面的路径中。您的代码应该出现。

【讨论】:

  • 你应该详细说明。
  • 完美答案:)
  • 递归搜索吗?
【解决方案2】:

可执行文件包含调试符号,这些符号指示与汇编代码的每一位相对应的文件(以及文件中的特定行)。这就是允许您在调试器中单步执行 C 代码的原因。调试符号由编译器放在那里(例如,通过使用 gcc 的 -g 参数)。

如果您没有用于编译可执行文件的 C 文件,调试器将无法向您显示 C,您将只能查看程序集。

【讨论】:

  • 我确实想查看程序集,但我不能,因为断点 main 指的是我没有的源文件。我想提醒您,我仅在我的 Ubuntu 上发出此错误。我的(虚拟化)基本操作系统上没有这个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多