首页 > 系统相关 >Linux下利用backtrace定位问题函数

Linux下利用backtrace定位问题函数

时间:2022-09-02 23:00:07浏览次数:52  
标签:07 22 -- 定位问题 08 13647 DEBUG Linux backtrace

最近遇到一个问题,程序莫名其妙崩溃,由于系统设置并没有生成core文件,因此也就不能通过gdb调试来查看出错时的调用栈信息。好在系统生成了crash.log文件,里面的backtrace信息可以帮我分析定位问题。
先来看一下当时的backtrace打印:

08-22 10:07:39.981 F/DEBUG (13647): backtrace:
08-22 10:07:39.981 F/DEBUG (13647): #00 pc 000000000031744c /usr/bin/myprogram
08-22 10:07:39.981 F/DEBUG (13647): #01 pc 0000000000315864 /usr/bin/myprogram
08-22 10:07:39.981 F/DEBUG (13647): #02 pc 0000000000315adc /usr/bin/myprogram
08-22 10:07:39.981 F/DEBUG (13647): #03 pc 00000000002c5fb4 /usr/bin/myprogram
08-22 10:07:39.981 F/DEBUG (13647): #04 pc 00000000002c3a64 /usr/bin/myprogram
08-22 10:07:39.981 F/DEBUG (13647): #05 pc 0000000000065f88 /system/lib64/libc.so (_ZL15__pthread_startPv+36)
08-22 10:07:39.982 F/DEBUG (13647): #06 pc 000000000001ed24 /system/lib64/libc.so (__start_thread+68)

然后使用addr2line工具,addr2line工具是一个可以将指令的地址和可执行映像转换为文件名、函数名和源代码行数的工具。这在内核执行过程中出现崩溃时,可用于快速定位出出错的位置,进而找出代码的bug。

用法

addr2line [-a| --addresses ] [-b bfdname | --target=bfdname] [-C | --demangle[=style]] [-e filename | --exe=filename] [-f | --function] [-s | --basename] [-i | --inlines] [-p | --pretty-print] [-j | --section=name] [-H | --help] [-V | --version] [addr addr ...]

参数

-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=:指定目标文件的格式为bfdname。
-e --exe=:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。

backtrace里给出了地址000000000031744c,使用命令:

addr2line 000000000031744c -e /usr/bin/myprogram -f -C -s

输出信息:

divide(int, int)
test.cpp:3

可以很轻松得到崩溃函数信息。

但有时也有例外,输出??:???:0,这表示崩溃程序没有包含符号表。

标签:07,22,--,定位问题,08,13647,DEBUG,Linux,backtrace
From: https://www.cnblogs.com/chaichengxun/p/16623545.html

相关文章

  • Linux--安装mysql
    第一步:查看mysql相关的软件查询当前系统中安装的名称带mysql的软件rpm-qa|grepmysql查询当前系统中安装的名称带mariadb的软件rpm-qa|grepmariadb第二步:卸载......
  • Linux--安装启动Tomcat
    第一步:上传压缩包第二步:解压压缩包tar-zxvfapache-tomcat-8.5.57.tar.gz-C/usr/local第三步:启动进入tomcat根目录下的bin文件夹中cd/usr/local/apache-tomcat-8......
  • Linux--安装配置JDK
    第一步:上传压缩包jdk8.tar.gz第二步:解压压缩包tar-zxvfjdk8.tar.gz-C/usr/local第三步:配置环境变量打开环境变量配置文件vim/etc/profile在文件的最后加上以......
  • 学习linux基础,补充记背
     1.linux基础1.1cp1.2ls1.3find1.4selinux1.5echo1.6pwd1.7通配符1.8创建1.9touch1.10连接1.11xargs1.12其他命令  1.linux基础命令1.1c......
  • 修改Linux的默认字符编码
     Windows的默认编码为GBK,Linux的默认编码为UTF-8。在Windows下编辑的中文,在Linux下显示为乱码。为了解决此问题,修改Linux的默认编码为GBK。方法如下:方法1:vi/etc/sysconf......
  • 10_Linux基础-SHELL入门1
    @目录10_Linux基础-SHELL入门1一.输入输出重定向二.2个特殊文件三.heredocument四.tee命令五.清空文件内容六.SHELL入门SHELL的变量SHELL接收参数数据类型引号区别......
  • 08_Linux基础-vim-tmux-字符编码
    @目录08_Linux基础-vim-tmux-字符编码一.vimvim编辑器作用vim模式vim命令模式vim编辑模式vim末行模式vim视图模式vim替换模式练习vim常用快捷方式退出vim编辑器的方法光标......
  • 07_Linux基础-计划任务-备份脚本-变量定义和使用
    @目录07_Linux基础-计划任务-备份脚本-变量定义和使用一.计划任务cronat二.计划任务练习-备份脚本计划任务实验重定向练习总结三.黑客-计划任务四.变量定义和使用07_L......
  • 06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命
    06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本一.NGINX和浏览......
  • 05_Linux基础-NGINX编译安装^判断是否启动^修改端口^启动停止重启^相关路径^中文乱码-
    05_Linux基础-NGINX编译安装判断是否启动修改端口启动停止重启相关路径^中文乱码-Windows、Linux文件传输博客......