![](/img/trans.png)
[英]how to know if a binary contains debugging symbols or not without file, objdump or gdb?
[英]Debugging without symbols?
我有应该失败的 simple.c 文件(我知道它失败的地方,我故意将错误放在那里):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s argument\n", argv[0]);
return EXIT_FAILURE;
}
char *hello = "hello";
*hello = 'H';
fprintf(stdout, "%s, %s!\n", hello, argv[1]);
return EXIT_SUCCESS;
}
第 1 部分)我将其保存为“hello.c”,并通过gcc hello.c -o hello
在不带调试标志的情况下进行编译。
然后,我希望 go 一行一行地通过主 function。 我尝试使用 gdb 如下:
运行gdb./hello
通过break main
设置断点
运行run 123
s
-> 失败
结果如下:
(gdb) info func
All defined functions:
Non-debugging symbols:
0x0000000000000568 _init
0x0000000000000590 fprintf@plt
0x00000000000005a0 __cxa_finalize@plt
0x00000000000005b0 _start
0x00000000000005e0 deregister_tm_clones
0x0000000000000620 register_tm_clones
0x0000000000000670 __do_global_dtors_aux
0x00000000000006b0 frame_dummy
0x00000000000006ba main
0x0000000000000740 __libc_csu_init
0x00000000000007b0 __libc_csu_fini
0x00000000000007b4 _fini
(gdb) break main
Breakpoint 1 at 0x6be
(gdb) r
Starting program: /mnt/c/Users/User/Documents/Debugging/hello
Breakpoint 1, 0x00000000080006be in main ()
(gdb) s
Single stepping until exit from function main,
which has no line number information.
__fprintf (stream=0x7fffff3ec680 <_IO_2_1_stderr_>, format=0x80007c4 "Usage: %s argument\n") at fprintf.c:27
27 fprintf.c: No such file or directory.
为什么会这样? 为什么通过尝试查找文件 fprintf 会失败? 认为预处理的标头应该处理所需的实现代码。
第 2 部分)当我使用-g
进行编译时,它出于某种原因工作。 但是在 gdb 中运行程序不会产生预期的分段错误:/ 为什么?
再次,请参阅:
$ ./hello 123
Segmentation fault (core dumped)
但
(gdb) run 123
Starting program: /mnt/c/Users/NichlasDesktop/Documents/uni/Compsys/Exercises/Debugging/exercise_code/hello 123
Hello, 123!
[Inferior 1 (process 632) exited normally]
第1部分)
s -> fails
在没有调试信息的情况下, gdb
无法将 map 指令转为源代码——文件路径和行号。 s
/ step
命令告诉gdb
执行与源语言中的当前语句相对应的指令。 gdb
无法告诉它是什么,所以它一直持续到代码中的任何地方,源 position(“SPOS”)信息可用。 这恰好在定义 fprintf 的 libc 中。 但是 fprintf 的源代码在您的环境中不可用,因此该消息。
您可以使用si
/ stepi
命令逐步执行各个指令,这不需要存在调试信息。
您没有显示如果从该点继续执行会发生什么,我怀疑它最终会遇到分段错误。
为什么会这样? 为什么通过尝试查找文件 fprintf 会失败? 认为预处理的标头应该处理所需的实现代码。
那不是标题。 它们不包含源代码。
第 2 部分)当我使用 -g 编译时,它出于某种原因工作。 但是在 gdb 中运行程序不会产生预期的分段错误:/ 为什么?
gdb
或任何其他调试器将安排将可执行文本段映射为私有而不是像通常的运行情况那样共享(使用MAP_PRIVATE
而不是MAP_SHARED
的mmap
)。 这是因为调试器需要文本段是可写的,以便可以覆盖指令以插入断点等。
您输入的“hello”是一个常量字符串文字,存储在可执行文件的只读文本段中。 这就是为什么在正常运行期间写入它会导致分段错误 - 文本段被映射共享。 然而,在调试器内部,文本段被映射为私有的,因此您可以对其进行写入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.