linux内核调试技巧之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 bfdname / --target=bfdname : 指定目标文件的格式为bfdname。
- -c / --demangle:将低级别的符号名解码为用户级别的名字。
- -e filename / --exe=filename:指定需要转换地址的可执行文件名。
- -f / --function :在显示文件名、行号输出信息的同时显示函数名信息。
- -s / --basenames :仅仅显示每个文件名的基址。
- -i / --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
- -j / --section :给出的地址代表指定section的偏移,而非绝对地址。
- -p / --pretty-print :使得该函数的输出信息更加人性化:每一个地址的信息占一行。
说明
- addr2line 有两种操作模式:1)十六进制地址在命令行中指定;2)十六进制地址通过标准输入指定(还没用过)
- 在android中addr2line工具,一般是arm-linux-androideabi-addr2line(针对arm平台)。
例子
- 以下是编写的一个小例子,用来展示如何使用addr2line。
源代码
#include<stdio.h>
int add(int a, int b)
{
return a+b;
}
void main()
{
int sum[10] = {0};
int i;
int array1[10] = {48, 56, 77, 33, 33, 11, 226, 544, 78, 90};
int array2[10] = {85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4};
for (i=0; i<10;i++) {
sum[i] = add(array1[i], array2[i]);
}
}
编译命令
gcc -Wl,-Map=gdb_example.map -g -o gdb_example gdb_example.c
查找main函数的地址
grep main ./ gdb_example.map
定位
addr2line 0x0000000000400501 -e gdb_example
linux内核调试技巧之addr2line的更多相关文章
- 【转】linux内核调试技巧之一 dump_stack
原文网址:http://blog.csdn.net/dragon101788/article/details/9419175 在内核中代码调用过程难以跟踪,上下文关系复杂,确实让人头痛 调用dump_ ...
- linux内核调试技巧之一 dump_stack【转】
在内核中代码调用过程难以跟踪,上下文关系复杂,确实让人头痛 调用dump_stack()就会打印当前cpu的堆栈的调用函数了. 如此,一目了然的就能看到当前上下文环境,调用关系了 假设: 遇到uvc_ ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- linux内核调试指南
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- 【转】Linux内核调试方法总结
目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_sta ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
- Linux内核调试的方式以及工具集锦【转】
转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- Linux内核调试的方式以及工具集锦
原文:https://blog.csdn.net/gatieme/article/details/68948080 CSDN GitHubLinux内核调试的方式以及工具集锦 LDD-LinuxDev ...
随机推荐
- C++ 类继承的对象布局
C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...
- CLR via C# 3rd - 08 - Methods
Kinds of methods Constructors Type constructors Overload operators Type con ...
- RAF(RandomAccessFile)类
作用:读取文件 /** * */ package com.io.file; import java.io.File; import java.io.IOException; import java.i ...
- 在Android Studio中使用lambda表达式
build.gradle中添加以下配置 Android{ ..... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targ ...
- Longest Increasing Subsequence
很久不写算法了== 写个东西练练手 最长上升子序列 输入n,然后是数组a[ ]的n个元素 输出最长上升子序列的长度 一.最简单的方法复杂度O(n * n) DP[ i ] 是以a[ i ] 为结尾的最 ...
- java中的程序流程控制
一.布尔逻辑1.布尔运算符:①短路和——&&:判断两个表达式,如果第一个为真,继续判断第二个表达式,如果第一个为假,就不需要判断第二个变大时②和——&:判断两个表达式,如果第一 ...
- Eclipse
001.自动注释 window--preferences--java--codeStyle--codeTemplate--comments //Types: /** *@author ${user} ...
- MongoDB学习笔记八:复制
[主从复制]最基本的复制方式就是建立一个主节点和一个或多个从节点,每个从节点要知道主节点的地址.运行mongod --master启动主服务器.运行mongod --slave --source ma ...
- VS高效开发快捷键
Ctrl + Tab 标签切换 Ctrl + '-'向后导航 Ctrl + Shift+'-'向前导航 Ctrl +Shift +空格 提示函数参数 Ctrl +F4 退出本标签 Ctrl+F 查找 ...
- Definition of success-成功的定义
"My definition of success is doing what you love. I fell many people do things because they fee ...