重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 6401|回复: 2
打印 上一主题 下一主题

在没有core文件的情况下定位问题

[复制链接]

20

主题

74

帖子

382

积分

学生管理组

Rank: 8Rank: 8

积分
382
跳转到指定楼层
楼主
发表于 2018-7-4 22:46:53 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 顾福源 于 2018-7-4 23:20 编辑

Linux环境下,程序崩溃后可以通过分析core文件来定位问题,一般形式为 gdb file file.core;
使用core文件分析的前提是程序崩溃后系统已经成功的将core记录下来了,但是在某些情况下程序崩溃了我们并没有得到有效的core文件(如系统没有使能coredump,或系统空间不够无法保存core文件),这时开发者就不能再使用gdb+core的方式来分析问题了;
没有core文件的情况下,开发者可以考虑使用命令"addr2line"来分析问题,以以下例子说明使用方法。
假abc.c中代码如下:
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include <stdio.h>

int fun(int a[])
{
        a[0] = 1;
}

int main()
{
        fun(NULL);

        return 0;
}


将abc.c编译: gcc -g abc.c -o abc   (使用-g参数生成调试信息)
编译之后得到了名为"abc"的可执行文件,我们执行他则必定会出现段错误。下面我们使用addr2line命令来进行定位:
输入 addr2line -e abc 080483e1,屏幕打印如下信息:
/dev/shm/abc.c:5
从屏幕打印的信息我们则可以知道,出现问题的地方在abc.c文件中的第5行,至此我们就找到了程序出错的地方。
此时,疑问就来了,"addr2line -e abc 080483e1"中的"080483e1"是怎么来的?"080483e1"这个值并不是凭空产生的,这个是通过查看系统信息得到的,我们可以通过命令"dmesg"将系统信息打印出来,或直接查看/var/log/dmesg;

在输入"dmesg"命令后,从打印的信息中(如上图)我找到了abc出现段错误时系统记录下来的信息,"080483e1"即为ip之后的值。

关于addr2line:
addr2line如何找到的这一行呢。在可执行程序中都包含有调试信息,其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table,addr2line实现了将机器代码上述内容之间的翻译。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

299

主题

684

帖子

6998

积分

学生管理组

Rank: 8Rank: 8

积分
6998
板凳
发表于 2018-9-25 16:16:03 | 只看该作者
回复 支持 反对

使用道具 举报

20

主题

74

帖子

382

积分

学生管理组

Rank: 8Rank: 8

积分
382
沙发
 楼主| 发表于 2018-7-4 23:19:57 | 只看该作者
1楼的描述中有地方不准确,"addr2line"不是命令,而是一个工具,它与gcc类似。在Ubuntu系统下,我们可以直接使用gcc编译程序,那我们就可以使用addr2line来定位问题;若是使用的arm-linux-gcc编译程序,则定位问题时就需要使用arm-linux-addr2line。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-12-22 02:28 , Processed in 0.187816 second(s), 31 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表