现在的位置: 首页 > 综合 > 正文

调试工具

2013年02月05日 ⁄ 综合 ⁄ 共 1949字 ⁄ 字号 评论关闭

1.printf

视觉是最清晰的,理想化的,你在每行都写一个printf,则你就能很清晰的定位,哪行错了。

2.ASSERT(CONDITION)

能够有效地提前地检测出问题。

UNUSED:在函数的参数之后添加,说明可能这个参数不会用到。

NO_RETURN:在函数的原型后添加说明函数没有返回。

NO_INLINE:加在函数原型告诉编译器不能把这个函数当作内联函数。

PRINTF_FORMAT:在函数原型告诉编译器函数会打印string ,也可以告诉编译器参数类型错误问题。

3.backtrace:
如果你想了解你的程序的位置,你可以在任意位置插入一个debug_backtrace();
backtrace其实就是把stack里的东西全部都显示出来,而call stack里都是以十六进制描述的,所以需要一个工具称为Backtraces来翻译成function names,source file line numbers;
但是有时候backtrace可能会有bug,举个例子,当函数在最后调用了另一个函数,那么调用的函数可能不会写进backtrace里。嗯。很好。接下来,开启虚拟机~~操作咯~
//****************************************************************************************
下面的操作就是解释backtrace的用法,但是backtrace需要16进制的地址,才能翻译。地址从何而来呢~需要用到前面讲过的,在build 下 pintos run kernel.o ,会显示出call stack:........有地址咯!
到threads/build 看到kernel.o了吧~开启terminal,输入backtrace kernel.o 0x.... 0x.... 0x....
地址是因为要看这个地址到底是什么意思,所以需要backtrace来翻译一下。
我的结果 debug_panic   intrff_stub, run_task, run_actions
第一个是debug_panic肯定的,因为这个是调用backtrace的原因。
//****************************************************************************************

4.GDB
在build中打开terminal,输入pintos --gdb -- run kernel.o,会出现waiting for gdb connection on port 1234
在build中再打开一个terminal 输入pintos-gdb kernel.o,接下来每行左边都有(gdb),输入target remote localhost:1234或者debugpintos,则原先的terminal跳出connected to 127.0.0.1
下面介绍几个比较简单的命令:
1.c 即执行,如果你想停止,则按ctrl-c。
2.break function/file:line/*address  设断点。
3.l *address  记住一定要加*哦~~可以列出给定地址的周围的代码。
4.bt 列出backtrace
5.btthread thread       //把给定的thread的backtrace列出来
6. btthreadlist list element     //列出给定的list的全部的线程的backtrace,但是必须要指定elements   list_elem     ,将会显示比如main,idle等线程及其backtrace

补充:线程都是以链表形式组成,节点是list_elem
/* List element. */
struct list_elem
  {
    struct list_elem *prev;     /* Previous list element. */
    struct list_elem *next;     /* Next list element. */
  };  是实现。在list.h中。
//-----------------------------------------------------------------------------------------

 

总结一下:

1.backtrace的用法:

(1)backtrace file address

(2)debug_backtrace()

2.gdb

(1)c

(2)ctrl c

(3)pintos --gdb -- run file

    pintos-gdb file

    debugpintos

(4)btthreadlist list elem

(5)bt

(6)l *address

(7)break

 

抱歉!评论已关闭.