Сценарии GDB для MOCK - PullRequest
       29

Сценарии GDB для MOCK

3 голосов
/ 07 июня 2011

Я пытаюсь смоделировать функцию (для модульного тестирования родительской функции), используя GDB.Один из способов сделать это - установить точку останова в функции, которую вы собираетесь смоделировать, и использовать команду GDB return .

Однако я не могу сделать то же самое при вызове GDB используется команда.

(gdb) b secret_check
Breakpoint 1 at 0x80483ba: file ut_gdb.c, line 6.
(gdb) start
Temporary breakpoint 2 at 0x804843c: file ut_gdb.c, line 34.
Starting program: ut.bin
Temporary breakpoint 2, main () at ut_gdb.c:34
34          int res = 0;
(gdb) bt
#0  main () at ut_gdb.c:34
(gdb) call fact(3)
Breakpoint 1, secret_check (check_type=1) at ut_gdb.c:6
6               if(check_type == 0){
The program being debugged stopped while in a function called from GDB.
Evaluation of the expression containing the function
(fact) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb) bt
#0  secret_check (check_type=1) at ut_gdb.c:6
#1  0x080483ff in fact (n=3) at ut_gdb.c:19
#2  
#3  main () at ut_gdb.c:34

Это ограничение в GDB?

Ответы [ 3 ]

0 голосов
/ 16 января 2012

Это можно сделать с помощью интерфейса Python GDB:

import gdb

class MyBreak(gdb.Breakpoint):
  def __init__(self, spec):
    gdb.Breakpoint.__init__(self, spec)
    self.silent = True

  def stop(self):
    #do whatever you need

    return False

MyBreak("secret_check")

Вам нужно быть осторожным с тем, что вы делаете в обратном вызове stop, не все законно. Я не имею в виду, что это не будет работать, но может аварийно завершить работу и / или измениться в следующих версиях, например:

def stop(self):
  print gdb.selected_thread().is_running() # True
  gdb.execute("return 5") #working, but you're not really supposed to do it!
  ...

В следующей версии 7.4 GDB, FinishBreakpoint должен быть в состоянии помочь вам с вашими поддельными функциями (просто пример, я его не тестировал):

class MyFinishBreakpoint (gdb.FinishBreakpoint)
  def __init__(self, param):
    gdb.FinishBreakpoint()
    self.param = param

  def stop (self):
    #change self.param as you want
    return False

class MyBreak(gdb.Breakpoint):
  def stop(self):
    #read parameters according to calling conventions
    param = gdb.parse_and_eval("...")
    MyFinishBreakpoint(param)

    return False
0 голосов
/ 12 августа 2014

Вы уверены, что это не работает? Просто игнорируйте длинное сообщение, которое вы получаете.

Для моего случая fn1 вызывает fn2. Я хочу проверить fn1 и макет fn2:

b fn2
call fn1   
// gdb stops on the breakpoint
return somevalue
c

И, кажется, все в порядке. (Я использую Cygwin GDB 7,8.)


Пожалуйста, посмотрите на: Отладка программно вызываемой функции с помощью GDB

0 голосов
/ 08 июня 2011

Я бы так и ожидал.Ограничение, вероятно, состоит в том, что GDB не может быть остановлен (и может продолжать) с двух точек останова одновременно.GDB должен поддерживать информацию о текущей точке, где программа остановилась, чтобы иметь возможность продолжить.Для поддержки того, что вы пытаетесь сделать, необходимо поддерживать стек состояний «продолжить» и иметь возможность указать, с какого из них вы хотите продолжить.

...