问题标签 [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.
c++ - 编译器生成的无效 DWARF
警告:编译器生成的无效 DWARF:DIE 0x000629bb 在 '/Code/test/Mac1.7to1.8Test/build/Mac1.7to1.8Test.build/Release/Mac1.7to1.8Test.build/Objects- 中有多个 AT_decl_line 属性正常/x86_64/OgreFramework.o'。
我在构建 C++ 项目的 XCode 3.2.6 中得到了这个,作为 Mac 上的新手,我什至从未听说过Dwarf!这个警告是关于什么的?
gcc - 从 a.out 文件中提取全局变量
编辑(更新的问题)
我有一个简单的 C 程序:
主程序
bsp.c
(该程序没有做任何有用的事情......我的目标是提取变量名它们被声明的位置和它们的内存地址)
当我编译程序时,我得到a.out
一个包含调试信息的 elf 文件。
5 年前,该公司的某个人在 .net 中编写了一个程序,该程序将从 a.out 文件中获取所有这些信息。这是代码返回的内容:
对于这个小程序,它非常适用,也适用于其他大型项目。
该代码有 2000 行长,有几个错误,它不支持 .NET 版本 4。这就是我尝试重新创建它的原因。
所以我的问题是,我迷失了,因为我不知道要采取什么方法来解决这个问题。这些是我一直在考虑的选项:
整理我在第一张图片上展示的程序的错误代码,并尝试查看它的作用以及它如何解析 a.out 文件以获取该信息。一旦我完全理解它,试着弄清楚为什么它不支持版本 3 和 4。
我可以创建正则表达式,所以可以尝试通过执行以下操作在 a.out 文件
中查找模式:到目前为止,我能够找到只有一个文件 (main.c) 的模式。但是当有多个文件时,它会变得更加复杂。我还没试过。也许它不会那么复杂,并且有可能找到模式。
安装Cygwin以便我可以在 Windows 上使用 linux 命令,例如
objdump
,nm
或elfread
. 当我使用这些命令时,我还没有玩够这些命令,例如readelf -w a.out
我获得了更多我需要的信息。为什么我没有花太多时间使用这种方法有一些缺点:缺点:在 Windows 上安装 cygwin 需要一些时间,并且在将这个应用程序提供给我们的客户时,我们不希望他们必须安装它。也许有一种方法可以只安装命令 objdump 和 elfread 而不必安装整个东西
优点:如果我们找到正确的命令来使用,我们将不会重新发明轮子并节省一些时间。也许这是解析命令结果的问题,例如
objdump -w a.out
如果您想下载 a.out 文件以便在此处对其进行解析,则它是.
概括
我将能够在 a.out 文件中获取全局变量。我想知道每个变量是什么类型(int、char、..),它们有什么内存地址,我还想知道在哪个文件上声明了变量(main.c 或 someOtherFile.c)。如果我不必使用 cygwin,我将不胜感激,因为这将使其更易于部署。由于这个问题要求很多,我试图将其拆分为更多:
也许我应该删除其他问题。很抱歉是多余的。
windows - Windows 中的 objdump 以查看调试信息
我需要在 .out 文件中获取变量的地址和成员名称。我基本上使用 gcc 在 linux 中编译了 ac 程序,我想看看文件的信息。linux上有很多例子,但我需要在windows上做。
编辑
我安装了 cygwin,由于某种原因 objdump 不起作用:
cygwin - 在cygwin上找不到objdump
我想在 cygwin 上使用 objdump 命令。我得到了例外:
-bash:objdump:找不到命令
为什么cygwin找不到objdump?
编辑----我可以在http://cygwin.com/packages/看到 binutils 。一旦我找到 binutils 包,我点击它,它会带我到这里。我该如何安装它?我到那里后应该做什么?
gcc - 获取 a.out 文件中符号的位置
这个问题很好地解释了如何获取 elf 文件的符号(变量、函数等)。
现在我有了符号,我想知道它们在什么位置(模块)。
例如,如果我编译一个由文件main.c
和. 还假设程序包含全局变量int Counter。那么我怎么知道变量Counter位于 main.c 中呢?someFile.h
someFile.c
main.c
g++ - /usr/bin/ld: 矮人错误
我正在尝试使用 nvcc 编译一个复杂的应用程序,并且需要将编译器从 mpic++ 更改为 g++,因为我遇到了这个错误:
什么是矮人?这个错误是什么意思?
有什么技巧可以解决吗?我在这里缺少什么有用的信息?
linux - readelf -s 不输出完整的变量名
我需要从编译的 c 程序文件中获取全局符号。当我使用该命令时,我使用的是 linux 命令readelf -s filePath
,这就是我得到的:
我画了一个蓝色矩形来表明变量名没有正确显示。他们在 25 个字符后得到修剪。我怎样才能让它显示全名?
windows - 找出模式以在编译的程序中查找变量
我需要从已编译的 c 程序中提取全局变量。我现在正在做的是使用 Linux readelf 命令来获取该信息。换句话说,当我这样做时:
我使用可以从这里readelf.exe
下载的程序来做到这一点。因为我使用的是 Windows,这是我需要的唯一命令。在 linux 上,我将打开控制台并执行readelf -w[i] myFile.out
无论如何,当我执行该命令时,我会得到类似的东西:
有了那个“树”,我可以得到所有的全局变量和类型。例如,如果您查看第一个变量NetBuf_ID_Ctr
,我们可以看到我们可以获得有关节点上的类型的信息 <0x86923>
。那个节点在树的某个地方!如果你看一下那实际上是第一个节点。开始的那个 <1><86923>....
,如果您在该节点内部看到,我们知道该变量是一个无符号整数,大小为 4 个字节。
现在我的问题是,当我使用 readelf 命令时,我得到
了 192883 行需要解析的文本!这棵树给了我更多我需要的信息。如果我用十六进制编辑器查看文件,这就是我所看到的:
请注意,我能够找到相同的变量NetBuf_ID_Ctr
,并且它旁边(突出显示)是它的地址<0x86923>
!
互联网上有没有地方可以指导我如何构建树?命令 readelf.exe 需要 0.1 秒来创建树!它将输出放在 StreamReader 上,这就是它如此快的原因。如果我希望将 StreamReader 放在内存上,将其转换为需要很长时间的字符串。
编辑
总之,我想知道如何从 myFile.out 构造树(readelf 的输出)。我无法弄清楚这种模式,互联网上也没有一个地方可以解释如何。
elf - 更改 elf 调试信息中列出的源文件
基本上我希望能够在 elf 二进制文件的 debug dwarf 部分中更改源文件的路径。
gdb - 矮人错误:编译单元标头中的版本错误(是 4,应该是 2)
在 RedHat Linux 上构建了一个共享对象,当所有代码都使用调试编译时,调试器 (gdb) 拒绝加载符号并发出错误,如下所示:
有了这个错误,我无法在任何函数中触发断点,也无法看到正确的堆栈跟踪。我重新编译了整个项目,但没有任何帮助。我确实知道过去一段时间调试该模块没有问题。
是什么导致了这个问题?