常用linux调试方法(包括kernel和app)

15 篇文章 1 订阅

当在linux编程中遇到segmentation fault的时候,可以利用core dump文件来debug,方法如下:
1. 在程序运行目录下(嵌入式设备最好是sdcard上面,因为core文件比较大)利用ulimit命令来修改core dump文件的大小。ulimit -a 可以查看ulimit命令的选项。会发现-c是core file size . 我们可以利用ulimit -c unlimited来设置core文件的大小为不受限制。
2. 当遇到segmentation fault的时候,就会发现程序运行当前目录会生成core文件(注意core文件比较大,费时比较长)。
3. 利用gdb来分析core文件。比如程序的名称是media_svc, gdb命令为gdb /usr/bin/media_svc core.然后进入gdb后,利用bt命令来看段错误地方的调用顺序来帮助寻找错误的地方。

gdb常用调试方法:
1.在shell脚本中使用gdb
有时候有些随机的bug很难复现,需要借助脚本来循环测试,这里说一下怎么样在shell里面调用gdb。

#!/bin/sh
num=0
while [ $num -ne 100000 ]
do
        echo -e "\033[31m num=$num\n \033[0m"
        #gdb -ex r --batch --args dvr_demo -i2&
        gdb -x /tmp/gdb_cmd --batch --args dvr_demo -i2&
        sleep 60
        killall dvr_demo
        let "num+=1"
        sleep 3
        name=`ps -ef |grep dvr_demo | grep -v grep | grep -v gdb | awk '{print $4}'`
        while [ "${name}" = "/usr/bin/dvr_demo" ]
        do
                echo -e "\033[31m ${name} is still runnning, wait... \033[0m"
                sleep 2
                name=`ps -ef |grep dvr_demo | grep -v grep | grep -v gdb | awk '{print $4}'`
        done
done

看到上面的例子,我们可以看到,当我们调用gdb时,进入gdb命令行页面,需要手动输入“r”来启动程序运行,在shell脚本中,我们可以利用-ex选项来表明要执行的“r”命令,也可以将命令写入一个文件,比如这里的/tmp/gdb_cmd,然后用-x来指定,当gdb启动后,会去执行这个文件中的命令。–batch是让gdb在dvr_demo命令执行完毕后自动退出。
上面的脚本就是循环用gdb来跑dvr_demo这个程序,60秒后将dvr_demo程序kill掉,这时,gdb会自动退出,然后通过检测ps命令中是否还是dvr_demo这个进程来确定是否退出成功,如果退出成功,则开启下一个循环测试。
上面的脚本还有一个问题,就是killall dvr_demo 会发送SIGTERM 信号给dvr_demo进程,但是该进程在gdb上跑,所以该signal就被gdb给截取了,所以这里还要对gdb进行设置,接受到信号时不要处理,直接转发给进程,所以我们可以在/tmp/gdb_cmd中写入如下命令:

handle SIGTERM nostop print pass noignore
run

第一行命令是设置对signla的处置方式,run命令是让程序跑起来。
signal的处置方式内容可以参考下面两篇博客:
https://www.cnblogs.com/dongzhiquan/p/4752649.html
https://blog.csdn.net/expleeve/article/details/6258175

  1. 如果调试kernel的模块的话,经常需要用到printk()来添加log, printk也分为不同的log level, 如果有些log设置为不会打印到终端的话,可以通过cat /proc/kmsg命令来看dmesg, 这个文件打开后是实时更新的,所以推出时需要ctrl-c来退出。通过这个命令就可以看实时的log, 这一点比dmesg要好用一点。
    另外,printk的log level可以通过cat /proc/sys/kernel/printk来查看
    通过echo 8 > /proc/sys/kernel/printk来设置log level。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值