GNU Binutils

建立main.c文件,内容如下:

#include <stdio.h>

void main()
{
int a = 5/0;
}

编译main.c:

gcc -g main.c

生成a.out文件

执行a.out, ./a.out, 出现如下错误信息:

Floating point exception (core dumped)

使用dmesg | tail命令查看:

[   26.511616] VBoxPciLinuxInit
[ 26.701426] vboxpci: IOMMU not found (not registered)
[ 4526.498595] usb 1-5: USB disconnect, device number 2
[ 4526.895918] usb 1-5: new high-speed USB device number 3 using ehci-pci
[ 4527.045378] usb 1-5: New USB device found, idVendor=2717, idProduct=ff48
[ 4527.045381] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4527.045383] usb 1-5: Product: MI MAX 2
[ 4527.045385] usb 1-5: Manufacturer: Xiaomi
[ 4527.045387] usb 1-5: SerialNumber: 8fc7deed
[31563.822978] traps: a.out[19804] trap divide error ip:4004e5 sp:7ffdd3cf89c0 error:0 in a.out[400000+1000]

根据错误地址(ip后面的地址),使用如下命令,可以定位(输出)函数名:

addr2line -e a.out 4004e5 -f

如下所示:

main
/home/gordon/main.c:5

建立main.cc文件,内容如下:

#include <iostream>
using namespace std; void foo()
{
cout << "the address of foo() is " << (void*)foo << endl;
} int main()
{
foo();
return 0;
}

编译main.cc:

g++ -g main.cc

生成a.out文件

执行a.out, ./a.out, 输出如下信息:

the address of foo() is 0x400896

根据输出的函数地址,使用如下命令可以查看函数名:

addr2line -e a.out 0x400896 -f

如下所示:

_Z3foov
/home/gordon/main.cc:5

可以看出C++编译器对函数名进行了编码,我们可以在上一步命令的最后加上--demangle=gnu-v3选项,输出函数名,如下所示:

addr2line -e a.out 0x400896 -f --demangle=gnu-v3

输出的函数名如下所示:

foo()
/home/gordon/main.cc:5

Android NDK tools

当NDK生成的.so运行崩掉时,通过NDK工具查找相关信息。

ndk-stack

实时分析日志

程序运行过程中,执行如下命令:

adb logcat | ndk-stack -sym <so文件所在路径>

当程序崩溃时,可输出崩溃信息。

先获取日志再分析

程序运行过程中,执行如下命令:

adb logcat > 1.log

程序崩溃后,通过如下命令获取崩溃信息:

ndk-stack -sym <so文件所在路径> -dump 1.log

arm-linux-androideabi-addr2line

获取日志中关键函数指针,例如

#00 pc 00031896 /data/app/com.tools/lib/arm/libtools.so

根据地址,使用如下命令找到对应的函数:

arm-linux-androideabi-addr2line -e libtools.so 00031896 -f

参考:如何定位Android NDK开发中遇到的错误

类Unix平台程序调试的更多相关文章

  1. .NET应用程序调试—原理、工具、方法

    阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...

  2. [安卓][转]Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  3. Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  4. MinGW —— Minimalist GNU for Windows、Cygwin —— Windows 下的类 unix 系统

    0. 楔子 Windows 下显然是没有 gcc 编译器的.对于一些软件或者工具如果想要在 Windows 平台下运行,而又需要依赖 gcc 编译其中的一些基于 C/C++ 实现的代码. 此时就借助 ...

  5. 【系统篇】从int 3探索Windows应用程序调试原理

    探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...

  6. Unix及类Unix系统文本编辑器的介绍

    概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...

  7. Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)

    Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...

  8. 57. Android之程序调试LogCat (转)

    无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一 ...

  9. 【matlab】MATLAB程序调试方法和过程

    3.8  MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...

随机推荐

  1. attr设置checked,disabled等属性失效的问题,jquery的attr和prop的区别

    最近做项目遇到一个问题,radio设置了默认checked值,attr("checked",true)切换checked值失效 最后发现是jquery1.6版本之后,attr和pr ...

  2. 【十九】require和include的区别

    1.require是一个函数,include是一个关键字 2.require是无返回值,include有返回值 3.include()会产生一个警告,而require()则导致一个致命的错误(出现错误 ...

  3. layui样式修改记录

    记录以免遗忘: .layui-elem-quote{ padding 15 改为 5 }

  4. Base64转换二进制文件对象 Blob/Base64转换 File 对象

    function convertBase64UrlToBlob(urlData) { var arr = dataurl.split(','),//去掉url的头,并转换为byte type = ar ...

  5. 前端开发必备之MDN文档

    想下载MDN文档的看前面的内容就可以了. HTML 源码下载 MDN官方下载地址:https://developer.mozilla.org/media/developer.mozilla.org.t ...

  6. Servlet小总结

    Servlet Servlet(服务器端小程序)是使用Java语言编写的服务器端程序,像JSP一样,生成动态的Web页.Servlet主要运行在服务器端,并由服务器调用执行. Servlet处理的基本 ...

  7. 模板引擎(smarty)知识点总结三

    阔别了几个月,小杨又来分享php知识.话不多说,言归正传,今天继续带来smarty的知识点. -----------------smarty  assign append 详解 对于这两个的区别和联系 ...

  8. Windows Server服务器日常管理技巧

    高效管理服务器一直离不开有效的服务器管理技巧,尽管你已经掌握了不少这方面的技巧,但服务器还有许许多多的技巧在等着你的总结,等着你的挖掘;这不,下面的一些服务器管理窍门就是笔者在最近的工作中总结出来的, ...

  9. 【读书笔记】A Swift Tour

    素材:A Swift Tour 推荐下载Playground:Download Playground objc 自己较为熟悉,想熟悉下风头正劲的 swift.就先从官方的入门手册开始撸. 每一小节,我 ...

  10. Python+selenium+eclipse+pydev自动化测试环境搭建

    一.        安装python 1.下载安装python 可访问python的官方网站:http://www.Python.prg找到下载页面下载需要的版本,可下载python2.x或者pyth ...