问题标签 [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.
debugging - ELF/DWARF 解析器输出结构元素
有没有办法使用 elf 文件提取结构中元素的大小和地址?我希望有一个可用的工具可以做到这一点并将其导出为更易读的格式。
我的最终目标是将 ELF 文件转换为 ASAM A2L 文件。可以做到这一点的开源/免费工具会更好,但大多数这样做的公司会为他们的工具收取很多费用。
c - 如何从矮人信息中获取结构成员偏移量?
我正在尝试将 DW_AT_data_member_location 属性值从 dwarf 信息打印到,get the member variables offset from a struct name
但似乎没有帮助函数起作用。
这是来自的 dwarf_info objdump
:
我能够获得属性代码但不能获得属性值:
这个变量的类型是什么?如何获得它的价值?哪个辅助函数可以在这里工作?
c++ - objdump 不显示 ostream 类的大小
我有这个代码:
编译它g++ -g main.cpp
(它在我的操作系统上打印 272)
之后,我执行objdump --dwarf=info a.out
并查看下一个调试信息条目(死)ostream
:
实际上ostream
只是basic_ostream<char, std::char_traits<char>>
Die 的 typedef 不包含带有大小(DW_AT_byte_size
)的属性,我不明白为什么。可执行文件中没有其他用于 ostream 类的模具,但编译器应该知道该类的大小(它用 打印大小sizeof
)。所以我的问题是:我怎样才能ostream
从objdump
.
c - DWARF - 如何在给定的二进制文件中找到函数的序幕结束/结尾起始地址?
我有一个 ARM 二进制文件,我需要准确地找到它的函数序言结束和结语开始的地址。换句话说,我需要功能体的边界。例如,如果我有一个函数,其程序集类似于:
我需要一种方法来使用 readelf 或 objdump 之类的东西快速找到0x00000326
and 0x0000034e
(prologue end/epilogue start) 或0x00000328
and (function body start/end)。0x0000034c
简单地反汇编它并检查代码是行不通的(理想情况下,我会使用脚本来解析 readelf 的输出或我用来获取 DWARF 信息的任何程序)。
根据 DWARF 4 标准,.debug_line 部分应该有行号信息,其中包括“ prologue_end
”和“ epilogue_begin
”,这正是我所需要的。但是,输出arm-linux-readelf --debug-dump=rawline,decodedline
并没有给我那个信息。
我正在使用gcc 4.8.2
标志-ggdb3
进行编译。
编辑:更多信息:objdump 和 readelf 都向我展示了这样的内容:
查看 binutils 的 dwarf.c 的来源,它似乎应该在行信息转储中打印类似“Set prologue_end to true”和“Set epilogue_begin to true”的内容。然而,所有的操作码似乎都是特殊的而不是标准的。
c - 静态推断 C 中的符号类型
作为回归测试的一部分,我想使用静态分析来确保标头中定义的 C 符号与 a 的基本类型具有相同的类型typedef
,后者也在同一个标头中定义。
鉴于我正在使用gcc
(连同它的扩展)并且可以生成 DWARF 调试信息,我实现这一点的策略如下:
test.c
:
然后执行:
这是来自的相关片段test.dump
:
如果您按照DW_AT_type
DWARF 信息中的地址,您将看到typedef
( my_type
) 和符号 ( MY_SYMBOL
) 确实属于同一类型 ( int
)。即这个测试通过了。
当然,我需要解析这个调试信息(可能是一个 perl/python 脚本),以证明每次测试用例运行时都会自动证明这一点。我的问题是:有没有更清洁/更简单的方法来做到这一点?
ios - 新单元测试目标出错:错误:没有这样的文件或目录 - 无法覆盖旧的 dSYM 文件
我刚刚在我的项目中添加了一个全新的单元测试目标,并收到以下错误:
错误:没有这样的文件或目录 - 无法覆盖旧的 dSYM 文件:旧的:'/Users/myuser/Library/Developer/Xcode/DerivedData/MyProject-ajbgwuvijemxwlgvdalbjlgirypy/Build/Products/Debug-iphonesimulator/MyProject.app.dSYM/Contents /资源/DWARF/MyProject'
有人有想法么?
c++ - 如何使用 gdb 调试使用 yasm 组装的代码?
我已经使用 yasm 进行代码汇编,并链接到我的 C++ 程序,但我无法在 gdb 中对汇编语言文件中的符号设置断点。
命令行可能不是非常有启发性,但我们开始吧:
一切顺利,程序运行。但是当我尝试将它加载到 gdb 中进行调试时,我似乎无法在 yasm 文件中的任何函数上放置断点。例如,我在那里有一个名为 MandelRect 的函数。这是 gdb 向我展示了它的调用位置,在 main 的某个地方:
这是 gdb 向我显示它的地址是什么:
这是 gdb 无法在其上放置断点:
如果我在正确的地址设置断点,当执行到达函数时,我无法逐条执行它。据我所知(被打扰),它只是从一个标签到另一个标签。
显然——好吧,也许吧?- 这与 gdb 坚持该文件是在没有调试的情况下编译的有关。但在相关的 .o 文件和二进制文件中似乎确实有符号:
那么我该如何解决呢?我误解了什么,还是yasm -g
坏了?有没有人设法让 yasm 的调试信息与 gdb 一起工作?
(系统是Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
。)
c++ - gdb 从哪里获取代码行?
当我使用 -g 编译程序并获得核心转储时,我可以使用它gdb
来读取可执行文件和核心转储来调试程序在崩溃之前遇到的情况。提供的功能之一gdb
是list
选项,可以列出使用可执行文件和核心转储编译的源代码。我strings -a
与可执行文件和核心转储一起使用,我什至找不到一个if
或for
声明,而我确信代码中有很多声明。那么代码是从哪里来的呢?我在一台计算机上编译代码并在另一台计算机上运行它,因此源代码在生成核心转储的计算机上不可用,并且它似乎不在可执行文件或核心转储中。有什么建议么?我真的想从可执行文件和核心转储中打印所有源代码,这可能吗?我的意思是不运行gdb
,我确信可以编写一个使用 gdb 并且可以列出整个代码的脚本,但我有兴趣自己做,gdb
因为我想了解源代码是从哪里获取的已格式化,我想尽可能多地了解它。
linux - 从可执行文件中转储 debug_loc 部分
如果在编译 C 文件时向 GCC 提供了默认选项 (-g),我如何从 Linux 上的可执行文件中转储 debug_loc 部分?我使用readelf
linux 实用程序。
GCC 默认生成 DWARF4 格式的 DWARF 信息,所以如果我通过 -g-dwarf2 我可以看到 .debug_loc 部分,但是如果使用默认选项生成信息,如何检查该部分,因为我在转储中看不到该部分?
compiler-construction - 在 DWARF 中编码实时范围
我想在 DWARF 中编码变量的生存范围。我该怎么做?我在 DWARF 3 pdf 的第 178 页规范中看到 DW_AT_high_pc 和 low_pc 不适用于带有 TAG_variable 标记的 DIE。我应该在哪里根据规范对其进行编码?