在GDB中调试过程中的ASM代码来自哪里? 根据我的知识,基本上是 如果我们使用GDB调试从C源代码编译的代码,则 编译器将在Elf/PE文件中留下源代码路径,因此 GDB将使用源公司...

问题描述 投票:0回答:1
但GDB如何在上述过程中提供ASM代码信息?我给我的计算机上捕获一个示例:

我的问题是:

GDB如何提供ASM代码?该ASM代码是由拆卸生成的吗? enter image description here如果如此,那么GDB如何保证拆卸精度? 众所周知,诸如OBJDUMP所使用的线性拆卸算法无法将数据与代码区分开,Ida Pro之类的商业工具也可以不时犯错

有人会给我一些帮助吗?谢谢!

  1. 记住“编译器”(例如
  2. GCC
  3. )做几件事:

preprocess(#includes,宏等)

debugging assembly gdb disassembly
1个回答
4
投票

填充(将汇编转换为对象代码)link(适当的包装对象到库/可执行文件)

    to远处是最复杂的部分是编译阶段。
  • 记住,汇编或不再是对象代码中包含的机器指令的直接表示。
  • ,回答您的问题:
  • GDB读取您的库/可执行文件,并琐碎(相对)提取机器指令,从而提取装配代码。 这是拆卸过程。
  • ,因为GDB直接从库/可执行文件中获取机器指令/对象代码,只要它能够将机器代码准确转换为汇编指令,就不会有太多问题提供准确的拆卸。
  • 在其他单词中,一个是1:从源代码到汇编的许多映射,这意味着给定源代码,给定的编译器,编译器选项等有许多可能的汇编代码排列。这意味着这很困难,如果不是不可能从纯对象代码得出源代码。 因此,为了有效调试C源代码,源代码必须可用于GDB,无论是嵌入式还是以其原始.c表单。
相关,从汇编代码到对象代码的1:1映射更接近,因为两者或不超级代表相同的内容 - 创建给定程序所需的内存中的说明布局。 因此,拆卸过程比任何潜在的“倒数”过程要简单得多。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.