創建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
當NDK生成的.so運行崩掉時,經過NDK工具查找相關信息。
程序運行過程當中,執行以下命令:
adb logcat | ndk-stack -sym <so文件所在路徑>
當程序崩潰時,可輸出崩潰信息。
程序運行過程當中,執行以下命令:
adb logcat > 1.log
程序崩潰後,經過以下命令獲取崩潰信息:
ndk-stack -sym <so文件所在路徑> -dump 1.log
獲取日誌中關鍵函數指針,例如
#00 pc 00031896 /data/app/com.tools/lib/arm/libtools.so
根據地址,使用以下命令找到對應的函數:
arm-linux-androideabi-addr2line -e libtools.so 00031896 -f