使用call命令在GDB中重复调用某函数

在白盒测试中经常使用GDB进行函数的分支覆盖测试,,但在测试对象函数触发很困难,测试效率就很低下。

假设测试函数fun1有10条分支。每次进入fun1需设置10个变量。

那么一般情况下要在GDB中操作10 * 10 = 100次才能将该分支覆盖完毕。

经过查找,GDB中存在一种方法,重复调用该函数,使用10+10 =20次即可覆盖分支。

GDB使用步骤:

1)首先对该函数打断点

有以下函数:

int webprc_cmmenu_lchk(WEB_CMMENU_LAN_PATH_CHK_STATUS *result, int filetype,CM_COMMON_INFO *cominf, WEB_FLAG_TYPE type, char *errmsg)

2)第一次,手动进入该函数

GDB将显示以下msg:

Breakpoint 2, webprc_cmmenu_lchk (result=0x1006cc8c, filetype=60, cominf=0x48197008, type=0 '\000',errmsg=0x10087f30 "\302\302\302\302\302\302"…) at webcmmenu.c:212212webprc_lock(WEB_SEM_LOCK);(gdb) n213result->status.status.size = sizeof(WEB_CMMENU_LAN_PATH_CHK_STATUS); (gdb) n214result->run_status = WEBSTS_CMMENU1_LANPATCH_CHK;

在前两行中显示了在进入webprc_cmmenu_lchk时各个参数的值:

<pre>

result = 0x1006cc8c

filetype = 60

cominf=0x48197008

type=0

errmsg = 0x10087f30

</pre>

3)继续执行,执行完函数时,即到达函数的结尾“}”时,不要退出该函数!

在GDB中执行以下命令:

call webprc_cmmenu_lchk(result=0x1006cc8c, filetype=60, cominf=0x48197008, type=0,errmsg=0x10087f30)

GDB将输出以下log:The program being debugged stopped while in a function called from GDB.Evaluation of the expression containing the function(webprc_cmmenu_lchk) will be abandoned.When the function is done executing, GDB will silently stop.

此时即意味着webprc_cmmenu_lchk函数又重新执行,进入参数与上一次执行相同。

原理:

经常用到GDB中call命令对字符串进行赋值操作,大多数都是调用系统库函数。

而在调用项目中的函数时,只要确定进入函数时的寄存器状态,自然可以重复调用该函数了。

又或者是后天的,我们不断学习,努力进取的路途中辛苦寻到的武器。

使用call命令在GDB中重复调用某函数

相关文章:

你感兴趣的文章:

标签云: