类Unix平台程序调试
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
类Unix平台程序调试的更多相关文章
- .NET应用程序调试—原理、工具、方法
阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...
- [安卓][转]Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
- Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
- MinGW —— Minimalist GNU for Windows、Cygwin —— Windows 下的类 unix 系统
0. 楔子 Windows 下显然是没有 gcc 编译器的.对于一些软件或者工具如果想要在 Windows 平台下运行,而又需要依赖 gcc 编译其中的一些基于 C/C++ 实现的代码. 此时就借助 ...
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...
- Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)
Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...
- 57. Android之程序调试LogCat (转)
无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一 ...
- 【matlab】MATLAB程序调试方法和过程
3.8 MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...
随机推荐
- Asp.Net Web API(一)
什么是Web API HTTP不仅仅服务于Web Pages.他也是一个创建展示服务和数据的API的强大平台.HTTP是简单的,灵活的,无处不在的.你能够想象到几乎任何的平台都会有HTTP服务库.HT ...
- 【java】实现一个简单的正则:判断一个字符串是否全由数字组成
package 正则; public class TestIsNum { public static void main(String[] args) { String s1="abc&qu ...
- ArcGIS API for JavaScript 4.2学习笔记[17] 官方第七章Searching(空间查询)概览与解释
空间分析和空间查询是WebGIS有别于其他Web平台的特点.到这一章,就开始步入空间分析的内容了. [Search widget] 介绍空间查询的核心小部件"Search". [S ...
- bzoj 3143: [Hnoi2013]游走
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- Centos7解决图形界面卡死问题
经常会遇到图形界面卡死,搜了一搜,解决办法如下: killall -9 gnome-shell
- 关于VS2017安装的一点扩充说明(15.5)
其实逆天不推荐自己慢慢离线,找个离线包更新下再打包更快 Key:http://www.cnblogs.com/dunitian/p/4667038.html VS完整卸载工具:https://gith ...
- iOS音频采集过程中的音效实现
1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...
- JMeter参数化实现
参数化:指对每次发起的请求,参数名称相同,参数值进行替换,如登录三次系统,每次用不同的用户名和密码. 1.1.1. 从csv文件读取(CSV Data Set Config) 步骤: 1)新建一个文 ...
- tomcat 设置jvm 参数
在catalina.bat中设置 正确的做法是设置成这样set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx256m,避免JAVA_OPTS参数覆盖
- VC6.0 突然打不开dsw 工程文件的解决方案
在vc编程中,经常遇到dsw工程文件无法打开,或者打开后看不到类和变量的问题.特别是把代码从一台电脑上copy到另一台电脑上以后,常常会碰到这种奇怪的问题.有时在编辑状态下也会发生成员变量或函数提示不 ...