首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

即使用-g3编译,addr2line也会返回??:0,gdb回溯工作正常

即使用-g3编译,addr2line也会返回??:0,gdb回溯工作正常。

这个问题涉及到编译器选项、调试工具和符号表等概念。

首先,编译器选项中的-g3表示生成包含完整调试信息的可执行文件。这些调试信息包括源代码行号、变量名等,可以在调试过程中帮助开发人员定位问题。

addr2line是一个工具,可以将地址转换为源代码的行号。通常情况下,当使用-g选项编译时,addr2line可以准确地将地址转换为源代码行号。然而,在某些情况下,即使使用-g3编译,addr2line也可能返回??:0,表示无法将地址转换为源代码行号。

这种情况下,可以考虑以下几个可能的原因:

  1. 编译器问题:某些编译器可能存在bug,导致即使使用-g3编译,addr2line仍无法正确转换地址。在这种情况下,建议尝试使用其他编译器或更新编译器版本。
  2. 编译器选项问题:除了-g3选项,还可能存在其他编译器选项影响调试信息的生成。可以检查编译器选项是否正确设置,并尝试调整选项以获得正确的调试信息。
  3. 符号表问题:addr2line依赖于可执行文件中的符号表来进行地址转换。如果符号表不完整或损坏,可能导致无法正确转换地址。可以尝试重新生成符号表或检查符号表是否正确生成。

至于gdb回溯工作正常的原因,可能是因为gdb使用了其他调试信息,如DWARF调试信息,来进行回溯。与addr2line不同,gdb可以使用多种调试信息源来获取源代码行号等信息,因此即使addr2line无法正常工作,gdb仍然可以进行回溯。

总结起来,即使使用-g3编译,addr2line返回??:0可能是编译器、编译器选项或符号表的问题。而gdb回溯工作正常可能是因为它使用了其他调试信息源。在遇到这种情况时,可以尝试调整编译器选项、更新编译器版本、重新生成符号表等方法来解决问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

全志R128芯片RTOS调试指南

,可为0 print_func : 打印函数,可用printf 返回值: level : 回溯层次 终端命令 在设备端的终端界面上支持使用 backtrace 命令对指定的任务进行回溯。...在 PC 端开发环境中,执行 callstack backtrace.txt 命令,获取以下回溯信息。...addr2line 分析 发生异常时,如果栈回溯失败,可以通过 addr2line 工具,对打印出来的栈上数据进行分析,从而确定栈回溯信息。...需要注意的是,使用该方法调试的开发人员,需要提前了解一些 ARM 体系架构和入栈出栈等相关知识。 用途 在栈回溯失败时,使用 addr2line 从栈上数据中分析栈回溯信息。...表示存在内存重复释放现象,打印出来的栈回溯信息是第二次释放该内存块时的调用链信息。

12410

linux内核调试工具-addr2linegdb定位问题

之前没有用过addr2linegdb等内核调试工具定位问题代码,这里记录一下在将某个网络驱动从4.9内核移植到5.7内核时出现内核崩溃起不来的问题。...: 0000000000000000 [ 2.669191] Call trace: 1.通过addr2line定位 首先找出函数地址,在源码编译目录下的System.map中可以找到,这里错误函数是...我用的编译链是aarch64-linux-gnu-,所以addr2line前面也要加这个前缀,这里一开始有个问题,我使用addr2line的时候没有输出代码行号,只输出两个"??"...2.通过gdb定位 使用 aarch64-linux-gnu-gdb vmlinux 命令进入gdb调试行,输入以下命令 (gdb) b*(0xFFFF800011AD4328) Breakpoint....supported_coalesce_params = ETHTOOL_COALESCE_USECS, #endif 编译完成后没有错误,系统启动正常内核不再崩溃。

1.4K10

段错误等造成死机问题的分析

在实际工作当中,通过会出现某个应用造成死机问题。如何解决该问题。 方法一:最简单办法,看打印,通过反复调试,看是哪条语句造成造成了死机。...实际当中可能不一定是A进程原因,因为此时B,C等进程在并发执行,甚至A,B,c 三个进程都在访问某一共享资源(如共享内存等)。...对于情况还可以使用addr2line  PC指针  -e  xxxx进程名 -f定位到某个C代码行 复杂情况: 如果一个进程包含很多库,甚至要调用底层驱动,定位起来就更加麻烦。...注意该进程以及改进程所在的库编译是必需加-g ,不能strip,否则反汇编出来没有C代码的映射行 如果是在内核空间,可以通过堆栈回溯法进程回溯。该方法需要熟悉汇编,其次需要耐心,这里不详述。...首先在内核当中打开coredup  开关,死机后就会产生一个core问题,事后可以通过 gdb调试方法来分析定位死机的位置。

1.2K20

MIT 6.S081 Lab Four -- Trap

ra中保存的是0x30,加上0x600后为0x630,printf的地址,执行此行代码后,将跳转到printf函数执行,并将PC+4=0X34+0X4=0X38保存到ra中,供之后返回使用。...---- 代码解析 这个函数就是实现曾经调用函数地址的回溯,这个功能在日常的编程中经常见到,编译器报错时就是类似的逻辑,只不过题目的要求较为简单,只用打印程序地址,而实际的报错中往往打印程序文件名,...当alarmtest产生如下输出并且usertests正常运行时,你的方案就是正确的: $ alarmtest test0 start ........alarm!...如果您告诉qemu只使用一个CPU,那么使用gdb查看陷阱更容易,这可以通过运行 make CPUS=1 qemu-gdb 如果alarmtest打印“alarm!”,则您已成功。...,所以后面的memmove函数才可以正常工作,在alarm_trapframe和trapframe之间进行数据的拷贝。

21530

addr2line 动态库

当然,用GDB可以找出地址对应的代码行。...不过相比addr2lineGDB需要将BUG现象重现一遍,所以对于不好重现的BUG,或是随机重现的BUG来说,使用addr2line就可以直接从backtrace找到对应的代码行,不需要重现现象,比GDB...出现这种情况是由于动态链接库是程序运行时动态加载的而其加载地址也是每次可能多不一样的,可见0x7f85839fa5c6是一个非常大的地址,和能得到正常信息的地址如0x400a13相差甚远,其不是一个实际的物理地址...能得到正常的出错地址。...我们可以通过查看进程的maps文件来了解进程的内存使用情况和动态链接库的加载情况,所以我们在打印栈信息前再把进程的maps文件打印出来,加入如下代码: char buff[64] = {0x00};

2.3K20

arm上backtrace的分析与实现原理

有三个特殊的通用寄存器:R13:在ARM指令中常用作堆栈指针SPR14:称作子程序连接寄存器(Subroutine Link Register)连接寄存器LRR15:称作程序计数器PC 还有一个寄存器...然后利用addr2line工具,就可以详细跟踪到函数的执行过程了。...gcc的有些编译优化命令,让FP寄存器优化掉,比如-fomit-frame-pointer这个优化让fp寄存器节省下来给其他的地方使用。所以要充分考虑这些问题。...一般来说,我们使用unwind优势比使用apcs更好,因为采用apcs时,产生更多的代码指令,对性能有影响,但是使用unwind方式只会产生一个额外的段空间,并不会影响性能,所以大多数情况下,使用unwind...使用这个选项编译出的二进制程序中可以包含 C 语言函数名称的信息,以方便函数调用链回溯时记录信息的可读性。

6.1K30

linux常用命令--开发调试篇

文件编译出来之后,我们可能不知道新增加的函数或者全局变量是否已经成功编译进去。这时候,我们可以使用nm命令来查看。...但是要特别注意的是,“瘦身”之后的elf文件由于没有了符号信息,许多调试命令将无法正常使用,出现core dump时,问题较难定位,因此只建议在正式发布时对其进行“瘦身”。...有时候我们需要反汇编来定位一些问题,可以使用命令: objdump -d cmdTest #反汇编整个cmdTest程序 但是如果程序较大,那么反汇编时间将会变长,而且反汇编文件很大。...有时候程序可能已经正在运行,但是又不能终止它,这时候仍然可以使用gdb调试正在运行的进程: gdb processFile PID #processFile为进程文件,pid为进程id,可通过ps命令查找到...in cmdTest[400000+1000] 该信息记录了cmdTest运行出错的基本原因(divide error)和出错位置(40053b),我们使用addr2line命令获取出错具体行号: addr2line

1.5K30

arm平台根据栈进行backtrace的方法

本文主要介绍在arm平台回溯函数调用栈(backtrace)的方法。 一、 背景 嵌入式设备开发过程中,难免遇到各种死机问题。这类问题的定位一直是开发人员的噩梦。...又由于LR是指向调用函数的(PC寄存器的历史值,通过addr2line工具或者把可执行文件反汇编,可以看到func1中的LR落在main函数中,并且指向调用func1的下一条语句)。...另外,并非每个函数都需要FP(具体哪些函数的栈帧中有FP哪些函数中没有,由编译器根据编译选项决定),那么没必要为它重新开辟一个栈帧,继续在调用者的栈帧上运行即可。...另外,gcc编译的优化选项如 o1、o2等会对影响栈帧布局。 这么看来 ,通过FP寄存器回溯的方式行不通了!!! 3....遗憾的是某些RTOS使用编译工具链不支持栈保护编译选项,好在资参考资料3中给出了一种实现方法。

5.2K20

Android基础开发实践:如何分析Native Crash

如果发现由于使用了Bugly等插件导致无法正常打印出这些信息,那么建议关闭这些插件再复现问题。...Native Crash调试方法 6.1 gdb调试 新版的Android Studio支持直接创建带有Native代码的工程,并使用cmake编译jni代码,内部使用llvm+lldb进行编译和调试。...尽管Android Studio默认不使用gdb进行调试,我们仍然可以使用gdb对我们的native代码进行调试,因为gdb是一款优秀的调试工具,尤其是对于我们的native源码单独进行编译,与java...在Android上使用gdb编译不是一件轻松的事情,但是并不复杂。Android SDK中实际上已经包含了一套gdb调试工具,我们直接拿来使用即可。...gdb,因为可能存在协议不一致导致gdb无法与gdbserver正常通信)。

17.1K153

Android NDK 开发中快速定位 Crash 问题

当然定位 Native 层代码问题最优的方式还是通过 IDE(AS、VS)或者 GDB 进行 debug 断点调试,本文利用一个非常简单的 case 说明 Native 层定位 crash 的一般流程。...我们可以借助于 ASAN (注意 Android 版本)进行定位,具体可以参考文章:用 Asan 提前解决 NDK 疑难 crash 写两行代码,先制造一个简单的 crash 场景。...用 addr2line 工具定位 addr2line 顾名思义,是内存地址转换成代码行号的工具。...另外在使用 addr2line 过程中经常会遇到 “??:?” 或 “??...:0” 这种情况,原因就是一般 C/C++ 代码在编译配置中不生成符号表 symbolic 信息,不过 AndroidStudio 默认为 so 文件添加符号表。 -- END --

1.2K30

MCU HardFault问题查找和破解方法

; 堆栈溢出,例如在使用中,局部变量分配过大,超过栈大小,导致程序跑飞; 在外设时钟开启前,访问对应外设寄存器,例如Kinetis中未打开外设时钟去配置外设的寄存器; 不当的用法操作,例如非对齐的数据访问...、除0操作(默认情况下M3/M4/M7,除0默认都不会触发Fault,因为ARM内核CCR寄存器DIV_0_TRP位复位值为0,而对M0来说DIV_0_TRP位是reserved的,不会产生Fault...三、HardFault回溯的原理 为了找到Hard Fault 的原因和触发的代码段,就需要深刻理解当系统产生异常时 MCU 的处理过程: 当处理器接收一个异常后,芯片硬件自动将8个通用寄存器组中压入当前栈空间里...参见如下图,当异常产生时,LR 会被更新为异常返回时需要使用的特殊值(EXC_RETURN),其定义如下,其高 28 位置 1,第 0 位到第3位则提供了异常返回机制所需的信息,可见其中第 2 位标示着进入异常前使用的栈是...Step3: 修改FreeRTOS的task.c文件增加以下3个函数,否则在编译时会报错提示这3个函数无定义。

4.6K21

GDB 调试工具使用方法详解

GDB 调试工具使用方法详解 1....finish:运行程序,知道当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。...程序错误 编译错:编写程序的时候没有符合语言规范导致编译错误。比如:语法错误。 运行时错误:编译器检查不出这种错误,但在运行时候可能导致程序崩溃。...gdb调试段错误,可以直接运行程序,当程序运行崩溃后,gdb会打印运行的信息,比如:收到了SIGSEGV信号,然后可以使用bt命令,打印栈回溯信息,然后根据程序发生错误的代码,修改程序。...6.3 gdb调试core文件 当设置完ulimit -c xxxx后,再次运行程序发生段错误,此时就会生成一个core文件,使用gdb core调试core文件,使用bt命令打印栈回溯信息

1.4K20

Linux调试工具

标志-DDEBUG=0将禁用所有的调试信息,可以在程序中添加如下语句: #ifndef DEBUG #define DEBUG 0 #endif 2.使用gdb调试 Gcc编译的时候要加上-g选项,让编译器在程序中添加额外的调试信息...本节将介绍两个这样的工具,当然还存在其他许多这样的工具(包括GDB的前端GNU insight),它们被各种开发团队所使用。...它是一个受通用公共许可证GPL保护的自由软件。 象所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此时 你可以查看变量,寄存器,内存及堆栈。...当程序越来越复杂时,内存的管理变得越加复杂,稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之一。...这些反调试技巧经常被恶意软件使用,干扰调试器工作或动态行为分析工作

9.8K43

gdb 调试笔记

一、环境安装 gdb 源码下载:https://ftp.gnu.org/gnu/gdb/ gdb 源码编译: mkdir gdb‐build‐7.7 cd gdb‐build‐7.7 .....call func 执行func函数并打印返回值 return result 强制返回返回值为result 六、实用操作 gdb 重放操作 repeat (1)启动参数 gdb ‐n :可以不加载任何...gdbinit文件,不想使用插件时不必去注释gdbinit文件了 gdb ‐q :不打印版本和介绍信息启动 gdb ‐write:对二进制程序可读可写启动,可对二进制程序指令进行修改,并保存到文件中,或者启动后...regexp 查找函数 info types regexp info address symbol 查找symbol所在的地址 info symbol addr 查找地址对应的symbol,如果找不到,返回最近的...else rsa‐>regs‐>in_g_packet = 1; } } 重新编译gdb .

87000

linux下的程序调试方法汇总

这个工具的好处是不需要源代码,程序不需要重新编译使用strace的基本语法是: strace 命令 strace有各种各样的参数。可以检查看strace的手册页来获得更多的细节。...{ int x = malloc(10 * sizeof(int)); x[10] = 0; } int main() { f(); return 0; } 编译程序: gcc -o test...GDB GDB是来自自由软件基金的调试器。它对定位和修复代码中的问题很有帮助。...你可以将一个崩溃的程序coredump附着到GDB并分析故障的原因。 GDB提供很多选项来调试程序。 然而,我们将介绍一些重要的选择,来感受如何开始使用GDB。...如果你还没有安装GDB,可以在这里下载:GDB官方网站。 编译程序: 为了用GDB调试程序,必须使用gcc的'-g'选项进行编译。这将以操作系统的本地格式产生调试信息,GDB利用这些信息来工作

3.9K21

GDB调试-从入门实践到原理

本来这篇文章想写写Windows下调试相关,奈何好多年没用了,再加上工作太忙,所以本文就只写了Linux下GDB调试相关,对于Windows开发人员,实在对不住了。...强制基于软件方式实现 使用数据断点时,需要注意: 当监控变量为局部变量时,一旦局部变量失效,数据断点失效 如果监控的是指针变量p,则watch *p监控的是p所指内存数据的变化情况,而watch...,然后触发中断 return 0 不再执行后面的指令,直接返回,可以指定返回值 call printf("%s\n", str) 调用printf函数,打印字符串(可以使用call或者print调用函数...:子进程,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在Linux系统中fork()系统调用成功返回两次,一次在父进程,一次在子进程 (gdb) show follow-fork-mode...ldd 在我们编译过程中通常会提示编译失败,通过输出错误信息发现是找不到函数定义,再或者编译成功了,但是运行时候失败(往往是因为依赖了非正常版本的lib库导致),这个时候,我们就可以通过ldd来分析该可执行文件依赖了哪些库以及这些库所在的路径

2.5K30

掌握GDB调试工具,轻松排除bug

gdb调试段错误,可以直接运行程序,当程序运行崩溃后,gdb会打印运行的信息,比如:收到了SIGSEGV信号,然后可以使用bt命令,打印栈回溯信息,然后根据程序发生错误的代码,修改程序。...6.3 gdb调试core文件 当设置完ulimit -c xxxx后,再次运行程序发生段错误,此时就会生成一个core文件,使用gdb core调试core文件,使用bt命令打印栈回溯信息。...可以激活当前处于禁用状态的变量或表达式 和 print 命令一样,display 命令用于调试阶段查看某个变量或表达式的值 它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行...CROSS_COMPILE=aarch64-linux-gnu- 编译 make make install 编译完成,在busybox目录下生成_install目录 定制文件系统 为了init进程能正常启动...为Image 编译kernel, 不会编译modules, 这样增加编译速度 启动qemu 下载qemu 需要注意的,qemu最好源码编译, 用apt-get直接安装的qemu可能版本过低,导致无法启动

62700
领券