gdb debug 信息 stabs 格式

GDB 源码分析系列文章三:调试信息的处理、符号表的创建和使用 GDB 源码分析系列文章三:调试信息的处理、符号表的创建和使用调试信息和符号表 阅读详情

gdb debug 信息 stabs 格式

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)

       << used on Gould systems for non-base registers syms >>
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 转载请注明


C++(Qt)软件调试---验证GCC编译优化和生成调试信息(8) 我们可以通过学习GCC编译器参数,在程序编译时选择合适的优化参数和生成调试信息参数,在运行性能、程序大小、调试方便三个方向进行权衡利弊。 例如在不需要考虑性能时可以完全关闭优化,生成尽可能多的调试信息,以方便调试; 而有些程序运行需要一定的性能,就可以选择开启一定较低级别的优化。 文章中所述内容多有不足,欢迎一起交流学习。 阅读详情

相关推荐

GDB文件格式及其在编程中的应用

GDB文件中的调试信息包含了程序的符号表,这些符号表记录了程序中定义的变量、函数和类型等的信息。通过符号表,GDB能够在调试过程中准确地定位和访问这些符号,从而提供更好的调试体验。此外,GDB文件还包含源代码的路径和位置信息,允许GDB在调试过程中显示源代码,并支持断点设置和单步调试等功能。在编程中,GDB文件格式用于存储程序的调试信息,包括符号表、源代码、断点位置等。通过GDB文件中的调试信息,GDB能够准确地定位和访问程序的各种调试数据,从而提供这些强大的调试功能。命令查看变量的值,使用。

ByteWhisper的博客 1410

调试信息格式(Debugging Format)简介

1.  实际使用中,多种调试信息格式,stabs, COFF, PE-COFF, OMF, IEEE-695, 以及DWARF。2. stabs      stabs取名于symbol table strings,因为开始的时候,调试信息是以字符串的形式存储在Unix的a.out

rrerre的专栏 5776

大众点评商家及评分数据(2012-2025)

大众点评及商家评分数据库全面覆盖全国范围内多个城市的商户信息,涵盖餐饮、购物、休闲娱乐等多个消费领域,包含商家基础信息、地理坐标、分类体系、经营状态、用户评价、消费水平及服务设施等共计28个字段。

Sunny9qx的博客 2692

stabs: c语言如何使用stabs存放debug信息,以及如何使用stabs查找函数, stacktrace 如何实现

stabs 已经被 DWARF 替代...... stabs是什么 Stabs (Symbol Table String) refers to a format for information that describes a program to a debugger. GNU C compiler如何使用stabs overview The GNU C compiler compil...

1597

Unity3D实战:5分钟搞定RTSP监控视频流播放(附完整代码)

本文详细介绍了如何在Unity3D中快速实现低延迟RTSP监控视频流播放,提供完整代码和优化方案。通过Video Player组件和FFmpeg集成,开发者可以轻松应对智能家居和安防监控领域的实时视频流挑战,显著降低延迟并提升性能。

weixin_29015051的博客 587

Win11上从零跑通Carla自动驾驶仿真:保姆级环境配置与避坑指南(Python 3.7+)

本文详细介绍了在Win11系统上从零配置Carla自动驾驶仿真环境的完整流程,包括Python 3.7+环境搭建、依赖安装、常见问题排查及性能优化技巧。通过保姆级教程帮助开发者快速避坑,实现稳定的自动驾驶仿真测试环境部署。

weixin_33488239的博客 420

CrashReporter 简介

CrashReporter 简介CrashReporter 是 Mac OS X 下的调试工具,其会记录 Mac 下所有应用程序的崩溃信息。

集腋成裘 1万+

13、网络通信中的字节序与内存测试

本文主要探讨了网络通信中的字节序问题以及嵌入式系统中内存测试的相关内容。在网络通信部分,重点分析了大端序和小端序的差异,以及TCP/IP协议中字节序的转换机制,并介绍了相关的宏定义和实现方法。在内存测试部分,详细阐述了内存测试的目的、常见问题以及具体的测试策略,包括数据总线测试、地址总线测试和设备测试。通过这些内容,嵌入式程序员可以更好地理解并解决实际开发中可能遇到的字节序和内存问题,从而提高系统的稳定性和可靠性。

mmm90的博客 111

GDB进行汇编级的调试

gcc -S test.c 生成test.s文件 as -o test.o -gstabs test.s 生成test.o文件 gcc -o test -Wall test.o gdb test

king_MCU的专栏 1316

解决gradle下载慢的问题

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。根级别的repositories主要是为了当前项目提供所需依赖包。慢的问题在于下载时链接的是官网,而官网下载速度太慢;1、解决gradle不同版本下载慢的问题。但是这个镜像站的版本不全,低版本可以用;有公司做的国内镜像站;

weixin_42551921的博客 2051

ADBMS1818芯片

 可测量多达18串电池电压 3 mV最大总测量误差 内置isoSPI接口 使用单根双绞线,长达100米 290 μs内可完成系统中所有单体电池电压测量。

m0_61973119的博客 4272

学 Linux_day4 GCC 调试信息选项

本文全面介绍了GCC编译器调试选项-g的使用方法和原理。主要内容包括:调试信息的作用(关联源代码与机器码,支持变量查看和函数跟踪);-g选项的基本用法和不同级别(-g0到-g3)的详细程度差异;与优化选项-O的配合使用注意事项;如何验证可执行文件是否包含调试信息(使用file和readelf命令);并通过实际GDB调试对比展示了有无调试信息的巨大差别。文章还提供了调试选项速查表和实践练习,帮助开发者掌握在开发阶段正确使用-g进行高效调试,在发布时去除调试信息的完整工作流程。

tianlei_的博客 406

YOLOv13多分支融合机制+SE注意机制 RepVGGBlock_OREPA架构 map提升4.89,召回率提升8.66

本文提出了一种改进的YOLOv13目标检测模型,通过引入RepVGGOREPA模块和重参数化技术,显著提升了模型性能。实验结果表明,采用RepVGGBlock后,mAP提升4.89,召回率提升8.66%。文章详细介绍了模型移植过程,包括创建YOLOv13-REPVGGOREPA配置文件、修改任务处理代码和模块初始化文件,并提供了完整的OREPA模块实现代码。该模块通过多尺度特征融合和SE注意力机制,实现了训练时的丰富表征能力和推理时的高效计算,为YOLO系列模型提供了新的优化思路。

FJN110的博客 2650

解决nasm汇编gdb无法单步调试

解决nasm汇编gdb无法单步调试 Single stepping until exit from function _start, which has no line number information.

随手写下笔记和感悟 1055

(11-3-03)多任务与元强化学习:综合实战:基于元强化学习的迷宫导航系统(3)

本文介绍了策略网络隐空间可视化的实现方法及其在强化学习中的应用。通过设计visualize_latent_space函数,使用t-SNE算法将高维隐空间特征降维至二维进行可视化,直观展示策略网络在不同任务中的特征分布。文章详细阐述了实现流程:状态收集、t-SNE降维和可视化绘图,并提供了完整的Python代码示例。实验结果表明,该方法能有效分析策略网络的学习过程与适应能力,为优化模型提供重要依据。同时,文章还介绍了主程序的完整流程,包括环境初始化、元智能体训练与评估、学习策略比较等环节,最后对实验结果进行可

码农三叔 1041

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

linux 中调试器 gdb 的使用

1.基本命令 1)进入GDB  #gdb test   test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。 2)查看源码  (gdb) l   源码会进行行号提示。   如果需要查看在其他文件中定义的函数,在

freeking101的博客 6311

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MacOS下调试信息格式区分

一直没弄明白DWARF和符号文件的区别,恰好在StackOverflow找到了详细的分析。DWARF是调试信息的格式,在开发阶段(未配置生成信息格式为dSYM的情况下)调试信息是在目标文件中的,调试时根据二进制执行文件中的映射表在目标文件中加载调试信息。但产品发布的时候目标文件作为中间会遗失,所以就要把这些调试信息从目标文件中剥离集成为单独的调试文件,即dSYM文件,在生成dSYM文件时会打入可执行文件一致的uuid,每次编译都会有不同的uuid,文件符号的匹配校验也是根据该uuid,所以对于面临发布的产品

硕硕的博客 453

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CFLAGS += -g$(DEBUG)中定义DEBUG = dwarf-2是什么意思?-g可用于后续生成反汇编与源代码的混合显示的.lst文件-h -C -s

Makefile调试信息配置摘要 在Makefile中,DEBUG = dwarf-2通过CFLAGS += -g$(DEBUG)生成-gdwarf-2编译选项,指定使用DWARF 2格式的调试信息。DWARF 2是嵌入式开发中广泛支持的调试标准,相比更新版本更轻量且兼容性更好。该配置: 为GDB调试和objdump反汇编提供源代码映射 支持STM32项目中的ST-Link调试 与-gc-sections链接选项兼容 不影响增量编译流程 DWARF 2在资源受限的嵌入式系统中表现优异,但也可根据工具链支持情

qq_46635513的博客 975

GDB调试进阶实战:如何快速定位C++程序崩溃根源?

掌握C++调试技巧,快速定位程序崩溃根源。本文深入讲解GDB进阶用法,涵盖段错误、内存泄漏等典型场景,结合实战案例解析核心命令与调试策略,提升问题排查效率,值得收藏。

CodeTrick的博客 446

GCC -g OPTION

-gProduce debugging information in the operating system's native format (stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging information. <br />On most systems that use stabs format, -g enables use of extra debugging information that only GDB

JIN RIZE's 研二 872

objdump gcc gdb

gcc:  -c 编译后汇编,不连接  -S 编译后停止,不进行汇编  -o 编译,汇编,连接  -g 生成调试信息  -gstabs  标识符 maingdb  break *标识符 :设置断点  info register :参看寄存器  run :运行  list :列出函数行   objdump: 一般常用的是objdump -x 显示文件头信息objdump -d 反汇编代码

dkkacceler的博客 763

prlink elf format

prelink error

karma 437

OpenBLAS调试符号管理:分离调试信息与生产环境优化

在高性能计算(High Performance Computing, HPC)领域,数值计算库如OpenBLAS的稳定性与性能同样关键。调试符号(Debug Symbols)包含函数名、变量名、源代码行号等关键信息,是定位内存泄漏、段错误(Segmentation Fault)等底层问题的核心依据。然而,完整的调试符号会使库文件体积增加3-5倍,在生产环境中导致内存占用上升和加载速度下降。 Op...

gitblog_00838的博客 1074

objdump -I

$ objdump -I objdump: option requires an argument -- I 用法:objdump  显示来自目标 的信息。  至少必须给出以下选项之一:   -a, --archive-headers    Display archive header information   -f, --file-headers       Display

miaotouyang的专栏 1231

从新手到专家:C++调试技能跃迁的7个关键节点

掌握高效C++调试技巧,快速定位并解决复杂程序问题。涵盖断点调试、内存检测、日志追踪等核心方法,适用于算法开发与项目实战,提升代码稳定性与开发效率。从新手到专家的进阶之路,值得收藏。

AlgoInk的博客 321

嵌入式开发必知:HEX、BIN、ELF、SREC文件格式深度解析与转换实战

在嵌入式系统开发中,可执行文件格式是连接编译、调试与烧录的关键环节。从原理上讲,编译器生成的原始机器码需要被组织成特定的容器或映像格式,才能被不同的下游工具正确识别和处理,这直接关系到开发效率和最终产品的可靠性。其技术价值在于,理解并掌握这些格式的差异与转换,是解决程序无法运行、调试信息缺失、量产烧录失败等工程问题的核心能力。常见的应用场景包括:使用GCC或Keil等工具链进行交叉编译后,需要将输出文件适配至J-Link、ST-Link等调试器进行程序下载;或是在进行OTA升级、量产烧录时,需根据不同硬件和

weixin_34192816的博客 388
上一篇: 使用 GDB 调试多进程程序
下一篇: dwarf调试信息格式入门
killmice
博客等级 码龄14年 119粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值