问题标签 [dwarf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
83829 浏览

elf - 如何使用 objdump 反汇编一个函数?

我的系统上安装了一个二进制文件,并想查看给定函数的反汇编。最好使用objdump,但其他解决方案也可以接受。

这个问题中我了解到,如果我只知道边界地址,我可能能够反汇编部分代码。从这个答案中,我学会了如何将拆分调试符号转换回单个文件。

但即使在那个单一文件上操作,甚至反汇编所有代码(即没有开始或停止地址,但-d有 的普通参数objdump),我仍然在任何地方都看不到那个符号。就所讨论的函数是静态的而言,这是有道理的,因此它不会被导出。尽管如此,valgrind将报告函数名称,因此必须将其存储在某个地方。

查看调试部分的详细信息,我发现该.debug_str部分中提到了该名称,但我不知道可以将其转换为地址范围的工具。

0 投票
2 回答
1964 浏览

compiler-construction - LLVM 和 dwarf 调试信息

我试图在 LLVM 优化期间保留 DWARF 调试信息,我的问题是:我可以以某种方式插入 LLVM 中每条指令的调试信息吗?在进行所有优化传递时,LLVM 会保留这些信息,然后将 DWARF 注释的 LLVM 优化 IR 转储给我吗?

我相信如果这可行,我可以有一个后端(当然支持那些调试信息)生成最终的最终代码(或多或少由于优化)可以用源代码调试,对吗?

0 投票
1 回答
626 浏览

c - 如何从 clang 获取更细粒度的行/列调试信息?

我正在编写对其他程序进行一些相当复杂的静态分析和动态跟踪的软件。该程序使用大量静态 DWARF 信息来协助跟踪,包括.debug_lineDWARF 部分的行/列信息。为了使该程序具有我们需要的准确性,它必须具有细粒度且准确的行号和列号信息才能填充到 DWARF 调试信息中。使用clangI 可以强制使用-g -Xclang -dwarf-column-info选项一起填充行和列信息。

但是,在某些情况下,clang 无法生成足够细粒度的列信息。一个特定的例子是 forfor循环。以下面的示例程序为例,我将其称为source01.c

我可以像这样编译它:

生成可执行文件a.out。然后我dwarfdump用来检查行/列信息是如何填充的:

查看该.debug_line部分,我看到了此可执行文件的调试信息中包含的所有行/列对:

如您所见,有对应于 的对 (5,10) 和对应于int i=0;的对 (5,27) ++i。但是,我希望(并且需要)还有一对 (5,19),它对应于i < 10,但它不存在。我已经检查了可执行文件的指令objdump,并确认确实有与比较相对应的指令i < 10(因此,它并没有被简单地“优化掉”)。

您对为什么 clang 不会填充此信息有任何直觉吗?或者有没有办法强制clang产生更细粒度的列信息?似乎clang应该具有这种能力,因为clang生成的 AST 在其自身与源代码行和列之间具有极其细粒度的映射。

谢谢你。

0 投票
1 回答
1014 浏览

xcode - 从 dSYM 中排除特定符号

我正在构建一个 iOS 项目,其中包含一个我希望从产品的 .dSYM DWARF 文件中排除其符号的子项目。

情况是子项目(一个静态库)包含有价值的专有代码,我不希望攻击者能够符号化,即使他们有用于重新符号化整个应用程序崩溃报告的 dSYM 文件。该子项目涵盖了一个非常具体的领域,并且经过了独立测试,因此我不担心无法在该代码中重新符号化堆栈跟踪。但是,我确实需要能够为应用程序的其余部分重新符号化崩溃报告,所以我需要一个 dSYM(因为与应用程序一起分发符号不是一种选择)。

我已经设法确保从二进制文件中删除所有相关符号,并设置 GCC_GENERATE_DEBUGGING_SYMBOLS=NO 从 dSYM 中删除了很多内容,但我仍然在 dSYM 文件中看到类私有 C++ 方法名称。作为参考,我正在使用clang。

如何在不影响该子项目符号的情况下为我的应用程序生成 dSYM?

0 投票
1 回答
161 浏览

dwarf - dwarf/dwarf2 是否有助于导出接受固定大小数组的函数的大小信息?

假设一个 C 模块包含以下函数定义:


是否可以从使用 gcc -g 编译源文件时获得的 dwarf 信息(嵌入在生成的 .o 文件中)中提取参数“a”的实际数组大小信息“6”?

我在目标文件上应用了“readelf -wi”来获取 dwarf 信息,但我找不到任何信息来导出固定数组大小。

0 投票
1 回答
57 浏览

compiler-construction - ELF 文件 (DWARF2) 中的 DIE 条目不正确

我正在尝试解析 DWARF2 格式的 ELF 文件。其中一个子程序似乎有一个不正确的 DIE 条目。它应该有一个条目“DW_TAG_subprogram”,但有“DW_TAG_compile_unit”,并且在 DW_AT_name 下有一些特殊字符。

这可能与编译/链接错误(编译器中的错误)有关吗?

非常感谢任何帮助。

谢谢

0 投票
1 回答
1146 浏览

ios - iOS:将堆栈跟踪条目转换为带有行号的方法名称

在删除了调试信息的生产应用程序中,如何转换以下输出:

要一个清晰的类和方法名?行号将是一种祝福。

这是我得到的输出:

最后一行是面包和黄油行,但是当我使用 dwarf 查找地址时,什么都不存在。

我在这里读到,您需要将堆栈地址转换为 dwarf 或 atos 的其他地址:

https://stackoverflow.com/a/12464678/2317728

我如何找到加载地址或幻灯片地址来执行计算?在将堆栈跟踪从应用程序内发送到日志之前,是否没有办法计算所有这些?如果不是,我将如何在收到堆栈跟踪后确定和计算这些值?更好的是,我是否缺少更简单的解决方案?

请注意,我不能只等待崩溃报告,因为该应用程序很小而且它们永远不会出现。我计划将堆栈跟踪发送到我们的服务器,以便在它们出现时立即修复。

社论

iOS 中的崩溃报告工具非常粗糙,尤其是与 Android 相比。在 android 中,错误的行被发送到谷歌分析,您使用地图来调试行 - 简单(比较)。对于 iOS,您将面临:a) 等待用户错误报告(对于小型应用程序来说不合理),b) 将堆栈跟踪发送到服务器,那里没有工具或有关如何符号化堆栈跟踪的信息,c) 依赖在大型准商业第 3 方库上。这肯定会让构建和扩大规模变得更加困难——希望苹果最终会注意到这一点。更有希望有人发现了一个我可能错过的更简单的解决方案;)

谢谢你的帮助!

0 投票
1 回答
1473 浏览

c - 打印来自 vmlinux 二进制文件的所有符号信息

由于之前有很多困惑,所以我在这里重新表述问题,删除旧问题。

我想从架构vmlinux上的二进制文件中打印所有符号信息 -以及运行时间,包括我不知道的任何其他信息。power-pcstaticdynamic(.so)kallsyms (module symbols)

我对actually I can not and its difficult to explain here why使用GDBreadelf/proc/kallsyms获取.system.mapcore file

我对知道如何GDB, readelf, objdump, kallsyms or systme.map生成更感兴趣。他们使用哪些内核数据结构?他们更喜欢使用哪个库 -libelflibdwarf

据我了解:

  1. 用于libelf/libdwarf所有静态信息。
  2. rld_map需要为动态 .so 文件解析部分。
  3. 对于kallsyms,我不确定如何处理将动态添加的 LKM 的符号信息。

考虑到上述情况,请建议我从头开始编写工具是明智的决定。我现在可以使用 libdwarf 获取所有函数名称及其地址的列表。

有人可以指导我找到一些最适合在上述情况下使用的源代码,或者可以针对上述场景进行一些修改,而不是从头开始编写一些东西,或者实际上是不可能的。(可能是 readelf/objdump/GDB 的一些片段)

如果需要,请要求澄清和更新。

谢谢 !!

0 投票
3 回答
2270 浏览

mach-o - dsym 文件的结构是什么?

构建应用程序时生成的 dsym 文件的结构是什么。我知道它包含 DWARF 调试信息,但什么是 dsym 文件。我想阅读其中的 DWARF 信息。

它只是一个仅包含调试部分的 Mach-O 二进制文件吗?我如何将它传递给一个 DWARF 解析工具pyelftool,例如读取 ELF 文件调试部分中的 DWARF 信息。

objdump -h用来打印 dsym 文件的各个部分(.dsym 文件是一个包,我只是引用包中的二进制文件)

0 投票
1 回答
760 浏览

c++ - 最大限度地减少调试信息的大小,以便在远程位置进行测试

我正在尝试创建一种将 C++ 项目的调试信息传输到远程位置进行测试的方法。在当前的开发周期中,对代码的微小更改需要传输整个二进制文件(大小为 100s MB,主要是调试信息)。

目前我解决这个问题的方法是使用 -gsplit-dwarf 将调试信息从目标文件中分离出来(没有调试信息的大小在我的连接上是可管理的),然后将调试文件与当前构建的副本进行比较遥控盒。

目的是为项目的调试文件提供一组补丁,以便可以在远程位置调试新代码。远程位置和本地计算机之间的连接速度很慢,因此最小化补丁的大小是最重要的,但它也应该与工具的运行时间相平衡。我已经将 bsdiff 和 xdelta 视为潜在的解决方案,并遇到了一个难题,其中 xdetla 速度快但太大而 bsdiff 在大小方面是完美的,但运行时间和内存要求比我想要的要高一点。

是否有我缺少的工具或方法,或者我只是以错误的方式解决这个问题?也许是 bsdiff 和 xdelta 的替代品?我知道像 gbdserver 这样的工具在这种情况下无法工作,因为我们在实际调试时有一些要求。bsdiff 的一些改变可以帮助提高性能吗?事实上,如果我使用的方法是合理的,那么在远程机器上保留构建副本以进行比较的好方法是什么。