gdb debug 信息 stabs 格式

您所在的位置:网站首页 新潟各市 gdb debug 信息 stabs 格式

gdb debug 信息 stabs 格式

2024-07-16 03:58| 来源: 网络整理| 查看: 265

C/C++、gdb、Linux gdb debug 信息 stabs 格式 2013 年 03 月 16 日 admin 发表回复(阅读 330 次)

stabs是用来做调试的信息,存储在符号表中。 名称来自symbol table entries。

这里是英文的介绍 :http://www.math.utah.edu/docs/info/stabs_toc.html

还有这里 : http://sourceware.org/gdb/current/onlinedocs/stabs/index.html

debug信息流程:

GNU C 编译器把c源代码编译成汇编语言.s文件, .s文件然后被翻译成.o文件,.o文件被链接成可执行文件。

如果编译的时候加了-g 参数 , gcc 会添加额外的调试信息到.s文件中。 这些调试信息最终被带到可执行文件中。这些调试信息包含了源文件的行号,类型变量,函数,以及他们的参数及作用域等等。

对于某些目标文件格式,这些调试信息放在.stab后面,这些信息分散在生成的代码中间。stabs是a.out和xcoff目标文件的原原生格式。GNU工具也可以在coff和ecoff目标文件中加入stabs格式。

汇编器把stabs信息添加到目标文件的符号表和字串表中。链接器再把所有目标文件中的符号表和字串表合并成一个。调试器会最终使用可执行文件中的这两个表最为调试信息的来源。

stabs格式概述

stabs格式中有三个关键字 .stabs (string), .stabn (number), or .stabd (dot).

每种类型的格式为:

.stabs "string",type,0,desc,value .stabn type,0,desc,value .stabd type,0,desc

.stabs 中 , string 域包含名字和类型信息。

.stabd 中, value 域是隐含的,为当前文件所在的位置,否则,value 域为重定向表的地址,函数帧指针偏移或者寄存器数.

理解stab的关键在于type域,每个可能的type数字定义了一种stab类型,而stab类型进一步定义了其string,desc,value的解释方式。表A 列出了所有可能的type域的值。

.stabs 的 "string" 域则包含了调试信息。这里的格式并没有预先定义下来,这保留了stabs格式的可扩展性。对某些stab类型,string域仅仅包含一个名字,对于另外一些stab类型而言,其中的内容可能是非常复杂的。

"string" 域的格式为:

"name[:symbol_descriptor] [type_number[=type_descriptor ...]]"

name 是stab记录的符号的名字。

symbol_descriptor 为字符描述信息,如果这个域没有但是有类型信息,那么这个stab表示一个局部变量。表C中列出了所有的 symbol_descriptors.

类型信息要么是 type_number,要么是  `type_number=’. 单单的 type_number 是一个类型引用,指向一个已经定义的类型。

`type_number=’ 是一个类型定义, 其中数字表示一个即将定义的新类型,这个类型定义可以通过数字引用其他的类型,这些类型值可以通过=来进行递归定义。

在类型定义中,如果=后不是数字,那么他就是一个类型描述,说明什么样的类型将被定义。在类型描述()后可能跟各种东西这个据每种不同的类型而定。如果=后是一个数字,那么这个数字就是一个类型引用。表D 是所有类型描述的列表。

如上所述,sring域可能很长,当string太长时,编译器可以可以把一个stabs分成两个,这两个stabs除了string意外,完全一样。只是第一个stabs的string以双反斜杠结尾。

一个C源码实例

main() { printf(“Hello world”); }

当编译时添加-g参数时,会生成下面的.s文件,行号是后加上去的.

The simple example at the assembly level 1 gcc2_compiled.: 2 .stabs "/cygint/s1/users/jcm/play/",100,0,0,Ltext0 3 .stabs "hello.c",100,0,0,Ltext0 4 .text 5 Ltext0: 6 .stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0 7 .stabs "char:t2=r2;0;127;",128,0,0,0 8 .stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0 9 .stabs "unsigned int:t4=r1;0;-1;",128,0,0,0 10 .stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0 11 .stabs "short int:t6=r1;-32768;32767;",128,0,0,0 12 .stabs "long long int:t7=r1;0;-1;",128,0,0,0 13 .stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0 14 .stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0 15 .stabs "signed char:t10=r1;-128;127;",128,0,0,0 16 .stabs "unsigned char:t11=r1;0;255;",128,0,0,0 17 .stabs "float:t12=r1;4;0;",128,0,0,0 18 .stabs "double:t13=r1;8;0;",128,0,0,0 19 .stabs "long double:t14=r1;8;0;",128,0,0,0 20 .stabs "void:t15=15",128,0,0,0 21 .align 4 22 LC0: 23 .ascii "Hello, world!\12\0" 24 .align 4 25 .global _main 26 .proc 1 27 _main: 28 .stabn 68,0,4,LM1 29 LM1: 30 !#PROLOGUE# 0 31 save %sp,-136,%sp 32 !#PROLOGUE# 1 33 call ___main,0 34 nop 35 .stabn 68,0,5,LM2 36 LM2: 37 LBB2: 38 sethi %hi(LC0),%o1 39 or %o1,%lo(LC0),%o0 40 call _printf,0 41 nop 42 .stabn 68,0,6,LM3 43 LM3: 44 LBE2: 45 .stabn 68,0,6,LM4 46 LM4: 47 L1: 48 ret 49 restore 50 .stabs "main:F1",36,0,0,_main 51 .stabn 192,0,0,LBB2 52 .stabn 224,0,0,LBE2 要详细解释上面的代码,需要进入顶上的页面进行逐行分析。上面的页面细致的解释了每种类型的详细格式。 另外这里有一篇文章,关于如何查看二进制文件中是否有debug信息。 http://www.dedoimedo.com/computers/linux-cool-hacks-4.html Table A: Symbol types from stabs Table A lists stab types sorted by type number. Stab type numbers are 32 and greater. This is the full list of stab numbers, including stab types that are used in languages other than C. The #define names for these stab types are defined in: devo/include/aout/stab.def type type #define used to describe dec hex name source program feature ------------------------------------------------ 32 0x20 N_GYSM global symbol 34 0X22 N_FNAME function name (for BSD Fortran) 36 0x24 N_FUN function name or text segment variable for C 38 0x26 N_STSYM static symbol (data segment w/internal linkage) 40 0x28 N_LCSYM .lcomm symbol(BSS-seg variable w/internal linkage) 42 0x2a N_MAIN Name of main routine (not used in C) 48 0x30 N_PC global symbol (for Pascal) 50 0x32 N_NSYMS number of symbols (according to Ultrix V4.0) 52 0x34 N_NOMAP no DST map for sym (according to Ultrix V4.0) 64 0x40 N_RSYM register variable 66 0x42 N_M2C Modula-2 compilation unit 68 0x44 N_SLINE line number in text segment 70 0x46 N_DSLINE line number in data segment 72 0x48 N_BSLINE line number in bss segment 72 0x48 N_BROWS Sun source code browser, path to .cb file 74 0x4a N_DEFD GNU Modula2 definition module dependency 80 0x50 N_EHDECL GNU C++ exception variable 80 0x50 N_MOD2 Modula2 info "for imc" (according to Ultrix V4.0) 84 0x54 N_CATCH GNU C++ "catch" clause 96 0x60 N_SSYM structure of union element 100 0x64 N_SO path and name of source file 128 0x80 N_LSYM automatic var in the stack (also used for type desc.) 130 0x82 N_BINCL beginning of an include file (Sun only) 132 0x84 N_SOL Name of sub-source (#include) file. 160 0xa0 N_PSYM parameter variable 162 0xa2 N_EINCL end of an include file 164 0xa4 N_ENTRY alternate entry point 192 0xc0 N_LBRAC beginning of a lexical block 194 0xc2 N_EXCL place holder for a deleted include file 196 0xc4 N_SCOPE modula2 scope information (Sun linker) 224 0xe0 N_RBRAC end of a lexical block 226 0xe2 N_BCOMM begin named common block 228 0xe4 N_ECOMM end named common block 232 0xe8 N_ECOML end common (local name) > 240 0xf0 N_NBTEXT ?? 242 0xf2 N_NBDATA ?? 244 0xf4 N_NBBSS ?? 246 0xf6 N_NBSTS ?? 248 0xf8 N_NBLCS ?? Table B: Symbol types from assembler and linker

Table B shows the types of symbol table entries that hold assembler and linker symbols.

The #define names for these n_types values are defined in /include/aout/aout64.h

dec hex #define n_type n_type name used to describe ------------------------------------------ 1 0x0 N_UNDF undefined symbol 2 0x2 N_ABS absolute symbol -- defined at a particular address 3 0x3 extern " (vs. file scope) 4 0x4 N_TEXT text symbol -- defined at offset in text segment 5 0x5 extern " (vs. file scope) 6 0x6 N_DATA data symbol -- defined at offset in data segment 7 0x7 extern " (vs. file scope) 8 0x8 N_BSS BSS symbol -- defined at offset in zero'd segment 9 extern " (vs. file scope) 12 0x0C N_FN_SEQ func name for Sequent compilers (stab exception) 49 0x12 N_COMM common sym -- visable after shared lib dynamic link 31 0x1f N_FN file name of a .o file Table C: Symbol descriptors descriptor meaning ------------------------------------------------- (empty) local variable f local function F global function G global variable p value parameter r register variable S static global variable t type name T enumeration, struct or type tag V static local variable Table D: Type Descriptors descriptor meaning ------------------------------------- (empty) type reference a array type e enumeration type f function type r range type s structure type u union specifications * pointer type

本文地址: http://www.bagualu.net/wordpress/archives/2349 转载请注明



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3