注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

非法指令与非法地址  

2013-03-16 14:01:04|  分类: Linux系统编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、堆栈破坏
这两种错误一般都是由于堆栈被破坏引起的,虽然很像,但是有本质区别。如果在程序运行或者core文件中出现这两种信号,需要区分一下他们的意义。
二、实例演示一下不同意义

[root@Harry segcore]# cat illaddr.c 
typedef int (somefun)();
somefun *nofun = (void*)0x0;
int main()
{
return nofun();
}
[root@Harry segcore]# gcc illaddr.c -o illaddr -g
[root@Harry segcore]# ./illaddr 
Segmentation fault (core dumped)
[root@Harry segcore]# cat illcode.c 
int main()
{
extern int nofun();
return nofun();
}
__asm__ ( "\n\t\
nofun: \n\t\
ud2\n\t \
");

[root@Harry segcore]# gcc -o illcode illcode.c -g
[root@Harry segcore]# ./illcode 
Illegal instruction (core dumped)
其中UD2是intel预留的一个指令,这个字段intel不会定义为任何指令。这一个涉及有些悖论的性质:这是一条非法指令指令。工程中很多事情就是这样,可能在理论上不太可能出现的问题,工程中都有这种需求。内核中的BUG()宏即使用该保留指令(intel处理器下有效)
linux-2.6.21\include\asm-i386\bug.h
#ifdef CONFIG_BUG
#define HAVE_ARCH_BUG

#ifdef CONFIG_DEBUG_BUGVERBOSE
#define BUG() \
do { \
asm volatile("1:\tud2\n" \
    ".pushsection __bug_table,\"a\"\n" \
    "2:\t.long 1b, %c0\n" \
    "\t.word %c1, 0\n" \
    "\t.org 2b+%c2\n" \
    ".popsection" \
    : : "i" (__FILE__), "i" (__LINE__), \
    "i" (sizeof(struct bug_entry))); \
for(;;) ; \
} while(0)

#else
#define BUG() \
do { \
asm volatile("ud2"); \
for(;;) ; \
} while(0)
#endif
#endif

三、在gdb中显示文件绝对路径
如果有时候要看文件的绝对路径,可以使用info source,它只显示当前文件,所以如果调用链比较多,需要先frame到一个文件之后再执行该命令。
(gdb) info source
Current source file is illcode.c
Compilation directory is /home/tsecer/CodeTest/segcore
Located in /home/tsecer/CodeTest/segcore/illcode.c
Contains 10 lines.
Source language is c.
Compiled with DWARF 2 debugging format.
Does not include preprocessor macro info.
(gdb) help info source
Information about the current source file.
(gdb) 

  评论这张
 
阅读(605)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017