使用Host的Target Server与Target的WDB Agent连接后,既可以使用Workbench的Debugger进行图形化的在线调试,也可以使用Host Shell的gdb进行命令行的调试。
如果没有Target Connection呢?其实VxWorks还提供了一个专门用在Shell里的dbgLib - debugging facilities(INCLUDE_DEBUG)
-> dbgHelp
b Display breakpoints and eventpoints
b addr[,task[,count [,quiet]]]
Set breakpoint
bi [bpId] Display breakpoint(s) detailed information
e addr[,eventNo[,task[,func[,arg]]]]] Set eventpoint
dprintf addr,task,count,fmtStr[,args]
Set dynamic printf eventpoint
bd addr[,task] Delete breakpoint
bdall [task] Delete all breakpoints and eventpoints
c [task[,addr[,addr1]]] Continue from breakpoint
cret [task] Continue to subroutine return
s [task[,addr[,addr1]]] Single step
so [task] Single step/step over subroutine
l [adr[,nInst]] List disassembled memory
tt [task] Do stack trace on task
hdprintf addr,access,task,count,fmtStr[,args]
Set hardware dynamic printf eventpoint
(bh() help entry lists access modes)
bh addr[,access[,task[,count[,quiet]]]] Set hardware breakpoint
access : 0 - instruction 1 - write 1 byte
3 - read/write 1 byte 5 - write 2 bytes
7 - read/write 2 bytes d - write 4 bytes
f - read/write 4 bytes 9 - write 8 bytes
b - read/write 8 bytes
写个小栗子
#include <stdio.h>
void eee()
{
printf("!%s\n", __FUNCTION__);
}
void ddd()
{
printf("!%s\n", __FUNCTION__);
eee();
}
void ccc()
{
printf("!%s\n", __FUNCTION__);
ddd();
}
void bbb()
{
printf("!%s\n", __FUNCTION__);
ccc();
}
void aaa()
{
printf("!%s\n", __FUNCTION__);
bbb();
}
用它来试试这个dbgLib的操作
先加个断点,例如在bbb()的位置
从aaa()启动程序,新任务会在bbb()处停住
使用tt()看一下调用栈,使用l()看一下即将执行的汇编代码(尽管我也看不懂)
使用dprintf()加个动态事件点,例如在ddd()的位置
使用c()让程序执行到下一个断点或结束
很不错的小机制!
打完收工
我是泰山 专注VX 0x10年
一起学习 共同进步