天衣有缝

冠盖满京华,斯人独憔悴~
posts - 35, comments - 115, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

一个调试工具编写的发现(原创)

Posted on 2007-05-11 17:02 天衣有缝 阅读(2298) 评论(4)  编辑 收藏 引用 所属分类: program

0.转载请保留原创:http://www.cppblog.com/jinglexy
MSN and Email: jinglexy at yahoo dot com dot cn


前不久写的一个调试器,公司很多模块使用linux环境,由于使用平台的缘故,bug非常多,于是编写了一个简单的调试器:大致功能是捕获程序异常,打印调用栈(也包括调用函数名),对运行的进程进行代码或函数调试,内核简单调试等。代码量并不大,有效代码行不超过3000行,花了10工作日完成,可能是时间紧迫吧,后期调试用了3周,汗哪!

 

1.使用ptrace系统调用关联一个进程后,需要waitpid(pid, NULL, WUNTRACED);一下,这个调试了很长时间才发现的,我猜测可能是因为ptrace后,不像信号立即 进入目标进程的处理。需要调度到目标进程后,进入do_waitpid()处理函数以设置正确的调试状态。如果不这样做,会导致释放管理进程失败。比较流行的调试工具gdb就是使用ptrace实现的,在gcc编译过程中也会插入专门的调试信息。原理比较简单,实现起来细节需要注意的也很多。

 

2.在跟踪程序异常时的调用栈中发现的:montavista编译环境的一个bug?(不能捕获动态库中的异常,主要是因为动态库加载时地址都不固定,使用了一种叫做got的技术,可以阅读coly大侠翻译的《连接器与加载器》一书,非常棒)

当程序收到异常信号后,内核进入do_signal()处理,在arch/arm/kernel/signal.c文件,

do_signal()  -- > handle_signal()  --> setup_rt_frame()

 

setup_rt_frame会拷贝上下文环境的数据结构到用户空间,

就是它的参数 siginfo_t *info,这个数据结构内部包含了上下文的数据结构struct ucontext ,

定义在:include/asm-arm/ucontext.h,内容如下:


struct ucontext {
 unsigned long   uc_flags;
 struct ucontext  *uc_link;
 stack_t    uc_stack;
 struct sigcontext uc_mcontext;
 sigset_t   uc_sigmask; /* mask last for extensibility */
};

arm_v5t_le-gcc中,上下文结构定义如下:

/opt/montavista/pro/devkit/arm/v5t_le/target/usr/include/sys/ucontext.h文件

typedef struct ucontext
  {
    unsigned long int uc_flags;
    struct ucontext *uc_link;
    __sigset_t uc_sigmask;
    stack_t uc_stack;
    mcontext_t uc_mcontext;
    long int uc_filler[5];
  } ucontext_t;
在上面数据结构中, __sigset_t uc_sigmask;被定义在上下文环境之前,

而在内核中 fp指针在 uc_mcontextarm_fp域中(先将uc_mcontext强制转换成struct sigcontext结构

asm-arm/sigcontext.h定义),

也就是第14 int 成员, 由于上面的stack_t 占内存为3 int型,所以在nipdebug调试库中修补为

*bp = ct->uc_sigmask.__val[17];

 

结论:montavista编译环境的ucontext.h文件定义上下文环境的数据结构位置不正确,

而该数据结构在/opt/arm/arm-linux/sys-include/sys/ucontext.h(即arm9)中定义是正确的,

/opt/ppc/include/sys/ucontext.hppc交叉编译)中也是正确的。

 

Feedback

# re: 一个调试工具编写的发现(原创)  回复  更多评论   

2007-05-16 21:04 by 蓝迪
您有工作经验,向您学习/
敝人是名在校生,想在软件上发展,可又比较迷茫,好象实用性并没有网络强。

能谈谈您对软件开发上的整体认识吗?期待

# re: 一个调试工具编写的发现(原创)  回复  更多评论   

2007-05-19 23:19 by raywill
可以这样:(原创)=>(翻译)

# re: 一个调试工具编写的发现(原创)  回复  更多评论   

2007-05-21 21:22 by 天衣有缝
OK:)

# re: 一个调试工具编写的发现(原创)  回复  更多评论   

2007-06-05 15:47 by 天衣有缝
删掉了一些东西,现在对软件还谈不上什么感觉,惭愧

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理