问题标签 [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 投票
1 回答
731 浏览

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!这个警告是关于什么的?

0 投票
1 回答
8614 浏览

gcc - 从 a.out 文件中提取全局变量

编辑(更新的问题)

我有一个简单的 C 程序:

主程序

bsp.c

(该程序没有做任何有用的事情......我的目标是提取变量名它们被声明的位置和它们的内存地址

当我编译程序时,我得到a.out一个包含调试信息的 elf 文件。

5 年前,该公司的某个人在 .net 中编写了一个程序,该程序将从 a.out 文件中获取所有这些信息。这是代码返回的内容:

在此处输入图像描述

对于这个小程序,它非常适用,也适用于其他大型项目。

该代码有 2000 行长,有几个错误,它不支持 .NET 版本 4。这就是我尝试重新创建它的原因。


所以我的问题是,我迷失了,因为我不知道要采取什么方法来解决这个问题。这些是我一直在考虑的选项:

  1. 整理我在第一张图片上展示的程序的错误代码,并尝试查看它的作用以及它如何解析 a.out 文件以获取该信息。一旦我完全理解它,试着弄清楚为什么它不支持版本 3 和 4。

  2. 我可以创建正则表达式,所以可以尝试通过执行以下操作在 a.out 文件在此处输入图像描述 中查找模式:到目前为止,我能够找到只有一个文件 (main.c) 的模式。但是当有多个文件时,它会变得更加复杂。我还没试过。也许它不会那么复杂,并且有可能找到模式。

  3. 安装Cygwin以便我可以在 Windows 上使用 linux 命令,例如objdump,nmelfread. 当我使用这些命令时,我还没有玩够这些命令,例如readelf -w a.out我获得了更多我需要的信息。为什么我没有花太多时间使用这种方法有一些缺点:

    • 缺点:在 Windows 上安装 cygwin 需要一些时间,并且在将这个应用程序提供给我们的客户时,我们不希望他们必须安装它。也许有一种方法可以只安装命令 objdump 和 elfread 而不必安装整个东西

    • 优点:如果我们找到正确的命令来使用,我们将不会重新发明轮子并节省一些时间。也许这是解析命令结果的问题,例如objdump -w a.out


如果您想下载 a.out 文件以便在此处对其进行解析,则它是.


概括

我将能够在 a.out 文件中获取全局变量。我想知道每个变量是什么类型(int、char、..),它们有什么内存地址,我还想知道在哪个文件上声明了变量(main.c 或 someOtherFile.c)。如果我不必使用 cygwin,我将不胜感激,因为这将使其更易于部署。由于这个问题要求很多,我试图将其拆分为更多:

也许我应该删除其他问题。很抱歉是多余的。

0 投票
1 回答
742 浏览

windows - Windows 中的 objdump 以查看调试信息

我需要在 .out 文件中获取变量的地址和成员名称。我基本上使用 gcc 在 linux 中编译了 ac 程序,我想看看文件的信息。linux上有很多例子,但我需要在windows上做。

编辑

我安装了 cygwin,由于某种原因 objdump 不起作用:

在此处输入图像描述

0 投票
1 回答
6090 浏览

cygwin - 在cygwin上找不到objdump

我想在 cygwin 上使用 objdump 命令。我得到了例外:

-bash:objdump:找不到命令

为什么cygwin找不到objdump?

编辑----我可以在http://cygwin.com/packages/看到 binutils 。一旦我找到 binutils 包,我点击它,它会带我到这里。我该如何安装它?我到那里后应该做什么?

0 投票
1 回答
779 浏览

gcc - 获取 a.out 文件中符号的位置

这个问题很好地解释了如何获取 elf 文件的符号(变量、函数等)。

现在我有了符号,我想知道它们在什么位置(模块)

例如,如果我编译一个由文件main.c和. 还假设程序包含全局变量int Counter。那么我怎么知道变量Counter位于 main.c 中呢?someFile.hsomeFile.cmain.c

0 投票
1 回答
15204 浏览

g++ - /usr/bin/ld: 矮人错误

我正在尝试使用 nvcc 编译一个复杂的应用程序,并且需要将编译器从 mpic++ 更改为 g++,因为我遇到了这个错误:

什么是矮人?这个错误是什么意思?

有什么技巧可以解决吗?我在这里缺少什么有用的信息?

0 投票
1 回答
8966 浏览

linux - readelf -s 不输出完整的变量名

我需要从编译的 c 程序文件中获取全局符号。当我使用该命令时,我使用的是 linux 命令readelf -s filePath ,这就是我得到的:

在此处输入图像描述

我画了一个蓝色矩形来表明变量名没有正确显示。他们在 25 个字符后得到修剪。我怎样才能让它显示全名?

0 投票
1 回答
484 浏览

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 的输出)。我无法弄清楚这种模式,互联网上也没有一个地方可以解释如何。

0 投票
3 回答
3218 浏览

elf - 更改 elf 调试信息中列出的源文件

基本上我希望能够在 elf 二进制文件的 debug dwarf 部分中更改源文件的路径。

0 投票
3 回答
32061 浏览

gdb - 矮人错误:编译单元标头中的版本错误(是 4,应该是 2)

在 RedHat Linux 上构建了一个共享对象,当所有代码都使用调试编译时,调试器 (gdb) 拒绝加载符号并发出错误,如下所示:

有了这个错误,我无法在任何函数中触发断点,也无法看到正确的堆栈跟踪。我重新编译了整个项目,但没有任何帮助。我确实知道过去一段时间调试该模块没有问题。

是什么导致了这个问题?