使用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:212
212         webprc_lock(WEB_SEM_LOCK);
(gdb) n
213         result->status.status.size = sizeof(WEB_CMMENU_LAN_PATH_CHK_STATUS);   
(gdb) n
214         result->run_status = WEBSTS_CMMENU1_LANPATCH_CHK;                    

在前兩行中顯示了在進入webprc_cmmenu_lchk時各個參數的值:

result = 0x1006cc8c
filetype = 60
cominf=0x48197008
type=0
errmsg = 0x10087f30

3)繼續執行,執行完函數時,即到達函數的結尾「}」時,不要退出該函數!


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命令對字符串進行賦值操作,大多數都是調用系統庫函數。 而在調用項目中的函數時,只要確定進入函數時的寄存器狀態,自然可以重複調用該函數了。


书籍推荐