類Unix平臺程序調試

GNU Binutils

創建main.c文件,內容以下:html

#include <stdio.h>

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

編譯main.c:linux

gcc -g main.c

生成a.out文件
執行a.out, ./a.out, 出現以下錯誤信息:android

Floating point exception (core dumped)ios

使用dmesg | tail命令查看:app

[   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後面的地址),使用以下命令,能夠定位(輸出)函數名:ide

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, 輸出以下信息:idea

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開發中遇到的錯誤

相關文章
相關標籤/搜索