linux内核调试方法,交叉编译程序出现Illegal instruction的调试方法

user_debug,linux kernel debug, linux kernel user debug,内核调试,打开内核调试


嵌入式内核: linux-2.6.32;
交叉编译工具链: arm-2007q1.tar.gz
host: Debian 5.0.3 32bit


1. 最近做一个项目,调用库的时候,出现了错误,是内核级别的:

/lib/libpng.so open successfully
dlopen: /lib/libcapi.so
Illegal instruction

由于库不是我编的,但是,用arm-none-eabixxx-ld, 和arm-none-eabixxx-string去看库的信息,没有错误,那么比较确定是编译的库存在指令不匹配的错误!为了辅助库的编译者找到问题,需要打开linux内核的调试信息,出错的时候,显示更多的详细信息;

2. 参考文章:

#ifdef CONFIG_DEBUG_USER    
    if (user_debug & UDBG_UNDEFINED) 
   {       
       printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n",    current->comm,   
                task_pid_nr(current), pc);       
       dump_instr(regs);    
   }
#endif

所以,在内核根目录下面的.config文件中,增加设定:CONFIG_DEBUG_USER=y

  • 在bootstrap工程中,修改main.c,添加命令行: user_debug=31

user_debug的值可根据情况选定,下面这几个宏与上面的粗体部分可对照一下,可得知各个bit使能之后能得到的信息。

#define UDBG_UNDEFINED (1 << 0)
#define UDBG_SYSCALL (1 << 1)
#define UDBG_BADABORT (1 << 2)
#define UDBG_SEGV (1 << 3)
#define UDBG_BUS (1 << 4)

3. 验证测试:

  • 重新编译bootstrap和linux内核,下载到设备中,
    再次出现:Illegal instructiond提示的时候,发现,比以前增加了更多信息,例如:
test_lib_lading (356): undefined instruction: pc=4031bbd0
Code: e3a04000 e3a08001 e1a03418 e1a00006 (e6ff3073)
Illegal instruction
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mynameislinduan

你的鼓励是我最大动力写博客不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值