zoukankan      html  css  js  c++  java
  • 类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
    

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

  • 相关阅读:
    ‘Host’ is not allowed to connect to this mysql server
    centos7安装mysql
    further configuration avilable 不见了
    Dynamic Web Module 3.0 requires Java 1.6 or newer
    hadoop启动 datanode的live node为0
    ssh远程访问失败 Centos7
    Linux 下的各种环境安装
    Centos7 安装 python2.7
    安装scala
    Centos7 安装 jdk 1.8
  • 原文地址:https://www.cnblogs.com/gaohongchen01/p/8311732.html
Copyright © 2011-2022 走看看