- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在查看从 C++ 文件生成的矮文件,我注意到它没有显示有关其中一个构造函数的任何信息。这是我的 C++ 文件 -
class C {
public:
C();
C(int x, int y);
int getX();
private:
int x;
int y;
};
class SubC : public C {
int z;
};
int f() {return 0;}
C c;
SubC subC;
int i;
double d;
这是我的矮人文件 -
The section .debug_info contains:
Compilation Unit @ offset 0x0:
Length: 0x134 (32-bit)
Version: 2
Abbrev Offset: 0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_producer : (indirect string, offset: 0xd): GNU C++ 4.3.0 20080428 (Red Hat 4.3.0-8)
<10> DW_AT_language : 4 (C++)
<11> DW_AT_name : (indirect string, offset: 0x75): test.cpp
<15> DW_AT_comp_dir : (indirect string, offset: 0x4d): /home/dwarf
<19> DW_AT_low_pc : 0x0
<21> DW_AT_high_pc : 0xb
<29> DW_AT_stmt_list : 0x0
<1><2d>: Abbrev Number: 2 (DW_TAG_class_type)
<2e> DW_AT_name : C
<30> DW_AT_byte_size : 8
<31> DW_AT_decl_file : 1
<32> DW_AT_decl_line : 1
<33> DW_AT_sibling : <0x86>
<2><37>: Abbrev Number: 3 (DW_TAG_member)
<38> DW_AT_name : x
<3a> DW_AT_decl_file : 1
<3b> DW_AT_decl_line : 7
<3c> DW_AT_type : <0x86>
<40> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<43> DW_AT_accessibility: 3 (private)
<2><44>: Abbrev Number: 3 (DW_TAG_member)
<45> DW_AT_name : y
<47> DW_AT_decl_file : 1
<48> DW_AT_decl_line : 8
<49> DW_AT_type : <0x86>
<4d> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)
<50> DW_AT_accessibility: 3 (private)
<2><51>: Abbrev Number: 4 (DW_TAG_subprogram)
<52> DW_AT_external : 1
<53> DW_AT_name : C
<55> DW_AT_decl_file : 1
<56> DW_AT_decl_line : 4
<57> DW_AT_declaration : 1
<58> DW_AT_sibling : <0x6d>
<3><5c>: Abbrev Number: 5 (DW_TAG_formal_parameter)
<5d> DW_AT_type : <0x8d>
<61> DW_AT_artificial : 1
<3><62>: Abbrev Number: 6 (DW_TAG_formal_parameter)
<63> DW_AT_type : <0x86>
<3><67>: Abbrev Number: 6 (DW_TAG_formal_parameter)
<68> DW_AT_type : <0x86>
<2><6d>: Abbrev Number: 7 (DW_TAG_subprogram)
<6e> DW_AT_external : 1
<6f> DW_AT_name : (indirect string, offset: 0x70): getX
<73> DW_AT_decl_file : 1
<74> DW_AT_decl_line : 5
<75> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x0): _ZN1C4getXEv
<79> DW_AT_type : <0x86>
<7d> DW_AT_declaration : 1
<3><7e>: Abbrev Number: 5 (DW_TAG_formal_parameter)
<7f> DW_AT_type : <0x8d>
<83> DW_AT_artificial : 1
<1><86>: Abbrev Number: 8 (DW_TAG_base_type)
<87> DW_AT_byte_size : 4
<88> DW_AT_encoding : 5 (signed)
<89> DW_AT_name : int
<1><8d>: Abbrev Number: 9 (DW_TAG_pointer_type)
<8e> DW_AT_byte_size : 8
<8f> DW_AT_type : <0x2d>
<1><93>: Abbrev Number: 10 (DW_TAG_class_type)
<94> DW_AT_name : (indirect string, offset: 0x41): SubC
<98> DW_AT_byte_size : 12
<99> DW_AT_decl_file : 1
<9a> DW_AT_decl_line : 11
<9b> DW_AT_sibling : <0xb6>
<2><9f>: Abbrev Number: 11 (DW_TAG_inheritance)
<a0> DW_AT_type : <0x2d>
<a4> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<a7> DW_AT_accessibility: 1 (public)
<2><a8>: Abbrev Number: 3 (DW_TAG_member)
<a9> DW_AT_name : z
<ab> DW_AT_decl_file : 1
<ac> DW_AT_decl_line : 12
<ad> DW_AT_type : <0x86>
<b1> DW_AT_data_member_location: 2 byte block: 23 8 (DW_OP_plus_uconst: 8)
<b4> DW_AT_accessibility: 3 (private)
<1><b6>: Abbrev Number: 12 (DW_TAG_subprogram)
<b7> DW_AT_external : 1
<b8> DW_AT_name : f
<ba> DW_AT_decl_file : 1
<bb> DW_AT_decl_line : 15
<bc> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x36): _Z1fv
<c0> DW_AT_type : <0x86>
<c4> DW_AT_low_pc : 0x0
<cc> DW_AT_high_pc : 0xb
<d4> DW_AT_frame_base : 0x0 (location list)
<1><d8>: Abbrev Number: 13 (DW_TAG_variable)
<d9> DW_AT_name : c
<db> DW_AT_decl_file : 1
<dc> DW_AT_decl_line : 17
<dd> DW_AT_type : <0x8d>
<e1> DW_AT_external : 1
<e2> DW_AT_location : 9 byte block: 3 0 0 0 0 0 0 0 0 (DW_OP_addr: 0)
<1><ec>: Abbrev Number: 14 (DW_TAG_variable)
<ed> DW_AT_name : (indirect string, offset: 0x3c): subC
<f1> DW_AT_decl_file : 1
<f2> DW_AT_decl_line : 18
<f3> DW_AT_type : <0x102>
<f7> DW_AT_external : 1
<f8> DW_AT_location : 9 byte block: 3 8 0 0 0 0 0 0 0 (DW_OP_addr: 8)
<1><102>: Abbrev Number: 9 (DW_TAG_pointer_type)
<103> DW_AT_byte_size : 8
<104> DW_AT_type : <0x93>
<1><108>: Abbrev Number: 13 (DW_TAG_variable)
<109> DW_AT_name : i
<10b> DW_AT_decl_file : 1
<10c> DW_AT_decl_line : 20
<10d> DW_AT_type : <0x86>
<111> DW_AT_external : 1
<112> DW_AT_location : 9 byte block: 3 10 0 0 0 0 0 0 0 (DW_OP_addr: 10)
<1><11c>: Abbrev Number: 13 (DW_TAG_variable)
<11d> DW_AT_name : d
<11f> DW_AT_decl_file : 1
<120> DW_AT_decl_line : 21
<121> DW_AT_type : <0x130>
<125> DW_AT_external : 1
<126> DW_AT_location : 9 byte block: 3 18 0 0 0 0 0 0 0 (DW_OP_addr: 18)
<1><130>: Abbrev Number: 15 (DW_TAG_base_type)
<131> DW_AT_byte_size : 8
<132> DW_AT_encoding : 4 (float)
<133> DW_AT_name : (indirect string, offset: 0x46): double
关键部分如下 -
<1><2d>: Abbrev Number: 2 (DW_TAG_class_type)
<2e> DW_AT_name : C
<30> DW_AT_byte_size : 8
<31> DW_AT_decl_file : 1
<32> DW_AT_decl_line : 1
<33> DW_AT_sibling : <0x86>
<2><37>: Abbrev Number: 3 (DW_TAG_member)
<38> DW_AT_name : x
<3a> DW_AT_decl_file : 1
<3b> DW_AT_decl_line : 7
<3c> DW_AT_type : <0x86>
<40> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<43> DW_AT_accessibility: 3 (private)
<2><44>: Abbrev Number: 3 (DW_TAG_member)
<45> DW_AT_name : y
<47> DW_AT_decl_file : 1
<48> DW_AT_decl_line : 8
<49> DW_AT_type : <0x86>
<4d> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)
<50> DW_AT_accessibility: 3 (private)
<2><51>: Abbrev Number: 4 (DW_TAG_subprogram)
<52> DW_AT_external : 1
<53> DW_AT_name : C
<55> DW_AT_decl_file : 1
<56> DW_AT_decl_line : 4
<57> DW_AT_declaration : 1
<58> DW_AT_sibling : <0x6d>
<3><5c>: Abbrev Number: 5 (DW_TAG_formal_parameter)
<5d> DW_AT_type : <0x8d>
<61> DW_AT_artificial : 1
<3><62>: Abbrev Number: 6 (DW_TAG_formal_parameter)
<63> DW_AT_type : <0x86>
<3><67>: Abbrev Number: 6 (DW_TAG_formal_parameter)
<68> DW_AT_type : <0x86>
<2><6d>: Abbrev Number: 7 (DW_TAG_subprogram)
<6e> DW_AT_external : 1
<6f> DW_AT_name : (indirect string, offset: 0x70): getX
<73> DW_AT_decl_file : 1
<74> DW_AT_decl_line : 5
<75> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x0): _ZN1C4getXEv
<79> DW_AT_type : <0x86>
<7d> DW_AT_declaration : 1
这部分包含关于类 C 的信息,包括采用 2 个整数的构造函数和构造函数之后的函数,但没有关于默认构造函数的信息。这是为什么?我在一个几乎相同的 c++ 文件上有另一个 dwarf 文件(两个 int 构造函数是一个 int 构造函数),它确实显示有关默认构造函数的信息,那么为什么两个文件中都没有信息?注意:另一个文件是用稍微不同的编译器编译的。
编辑:如果你很好奇,我用来生成 dwarf 文件的命令是 - g++ -g -c test.cpp -o test.o
然后是 readelf --debug -dump=info >test.txt
.
最佳答案
我对此有几个不同的问题。如果您的构造函数 C::C(void) 是在源代码中实现的(而不是编译器合成的简单构造函数),我希望在 DWARF 中看到它的描述,如果没有其他原因,您可能会介入这个函数,你会想看到关于你的方法的参数和 block 的符号信息。如果 C::C(void) 是由编译器提供的,我不知道我是否会将其标记为 DWARF 中未提及的错误。
许多编译器还尝试从 DWARF 中删除未使用的类型以减少调试信息的大小。您声明 C::C(int,int) 但不定义/调用它。我确定这只是因为这是一小段代码示例 - 但仍然请记住,如果编译器认为 C::C(int,int) 未定义/未使用,它可能会选择从调试中省略它信息。有时,这些未使用的类型缩减方案也存在错误,它们会忽略真正应该包含的信息。当编译器删除未使用的类型时,这些玩具示例编译单元可能会导致特别意外的调试信息。
对于它的值(value),通过 clang 运行您的示例编译单元会产生以下 dwarf(这是 Mac OS X 上的 dwarfdump
输出 - 它省略了 DW_
前缀名称有点奇怪,但在其他方面足够可读。)
0x00000032: TAG_class_type [4] *
AT_name( "C" )
AT_byte_size( 0x08 )
AT_decl_file( "/private/tmp/b.cc" )
AT_decl_line( 1 )
0x0000003a: TAG_member [5]
AT_name( "x" )
AT_type( {0x00000026} ( int ) )
AT_decl_file( "/private/tmp/b.cc" )
AT_decl_line( 7 )
AT_data_member_location( +0 )
AT_accessibility( DW_ACCESS_private )
0x00000049: TAG_member [5]
AT_name( "y" )
AT_type( {0x00000026} ( int ) )
AT_decl_file( "/private/tmp/b.cc" )
AT_decl_line( 8 )
AT_data_member_location( +4 )
AT_accessibility( DW_ACCESS_private )
0x00000058: TAG_subprogram [6] *
AT_name( "C" )
AT_decl_file( "/private/tmp/b.cc" )
AT_decl_line( 3 )
AT_declaration( 0x01 )
AT_external( 0x01 )
AT_accessibility( DW_ACCESS_public )
0x00000062: TAG_formal_parameter [7]
AT_type( {0x0000002d} ( C* ) )
AT_artificial( 0x01 )
0x00000068: NULL
0x00000069: TAG_subprogram [6] *
AT_name( "C" )
AT_decl_file( "/private/tmp/b.cc" )
AT_decl_line( 4 )
AT_declaration( 0x01 )
AT_external( 0x01 )
AT_accessibility( DW_ACCESS_public )
0x00000073: TAG_formal_parameter [7]
AT_type( {0x0000002d} ( C* ) )
AT_artificial( 0x01 )
0x00000079: TAG_formal_parameter [8]
AT_type( {0x00000026} ( int ) )
0x0000007e: TAG_formal_parameter [8]
AT_type( {0x00000026} ( int ) )
0x00000083: NULL
关于c++ - 矮人调试信息缺少构造函数上的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304294/
我正在尝试在 map 上绘制一些疾病事件数据的位置。 我用它来导入数据: ByTown% addProviderTiles("CartoDB.Positron")%>% addPolygons
我有一个文件调用 find.js,我使用 node find.js 运行,我的节点是版本 10 我不知道为什么我无法使用 async await。 const axios = require("axi
我有一个项目作为引用添加到 System.Web。 但是,它似乎无法获取 HttpContext。这样做: Imports System.Web _ApplicationBase = HttpCont
在互联网上找到这段代码,出于某种原因它缺少 while 循环逻辑“while(i....)”,虽然我找到了 PigLatin* 问题的其他可行解决方案,但我真的很想了解这个正在工作。 *PigLati
我工作了一整天来运行 Xampp 并在其上安装 TYPO3。现在我登录到后端,但没有显示许多管理模块,例如模板、访问等。 - 一定是我做错了什么,但我不知道。 these are the module
你好 我有编译这个问题 \begin{equation} J = \sum_{j=1}^{C} \end{equation} 我不断收到错误 missing $ inserted 这很奇怪,因
我正在尝试使用 SQLite CLI,但无法获得 generate_series功能来工作。我可以按照文档中的建议使用递归 CTE 对其进行模拟,但我似乎无法获得该链接中的任何示例。这是我的 sess
我目前正在开发我想要的软件,而软件正在安装,它可以在后台为软件创建 native 图像。 我正在考虑使用 NGEN 并将进程优先级设置为低,因为我不希望它消耗 100% CPU。但是我发现我的计算机上
我想使用 Xcodes Instruments 进行 UI 自动化测试。但似乎缺少“自动化”。我怎样才能添加这个? 最佳答案 如果您想使用自动化仪器,请使用 Xcode 7.3。 Apple 在 Xc
我目前在 JS 开发中迈出了一小步,并编写了以下链接添加器: const button = document.getElementById('button') const listdiv = docu
此代码有什么问题: NSError *error = nil; [SFHFKeychainUtils deleteItemForUsername:@"IAPNoob01" andServiceName
出于某种原因,在安装和配置(我认为)一切之后,com.adobe.utils.AGALMiniAssembler 不见了,其他一切正常。 我认为我已尽一切努力让孵化器正常工作,但显然我错过了一步。 如
我有一个名为 new 的方法。调用 new 时,我传递了一个参数,但是当我运行应用程序时,出现没有参数或参数为空的错误。 StepReader.pm package StepReader; use s
安装 gtk 1.2(包名 gtk1)和 macports chokes 在最终的 make 中,在 libintl.h 的第 440 行。 extern locale_t libintl_newlo
我用按钮创建表格。 这是javascript代码: function layersListTable(layers) { var content =''; $.each($(layer
我在使用此 javascript 时遇到此错误,任何人都可以帮我弄清楚我做错了什么吗? $(this).prepend('Check availability »'); 它给我错误 mis
我有一个独立的工具链 NDK13b、api19、llvm 3.8 编译器、arm 32 位、带有 libcpp(llvm C++ 库) 我想避免依赖 libgcc,所以我构建了 compiler-rt
我按照一些教程使用 phonegap 的条形码扫描器插件。但是当我从现有源创建一个新的 android 项目来创建条码库时 (step 6 in this page)我收到错误:“AndroidMan
我现在尝试在 Eclipse 中打开我的布局 xml 文件。我只得到错误 No XML content. Please add a root view or layout to your docume
我的 android-sdk-windows\tools 目录中缺少层次结构查看器工具。 工具链接: http://developer.android.com/guide/developing/too
我是一名优秀的程序员,十分优秀!