Embedded GDB脚本到MOCK

Embedded GDB脚本到MOCK,embedded,gdb,embedded-linux,Embedded,Gdb,Embedded Linux,我试图使用GDB模拟一个函数(用于单元测试父函数)。一种方法是在要模拟的函数中设置断点,并使用GDB return命令 然而,当使用GDB call命令时,我不能做同样的事情 (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:

我试图使用GDB模拟一个函数(用于单元测试父函数)。一种方法是在要模拟的函数中设置断点,并使用GDB return命令

然而,当使用GDB call命令时,我不能做同样的事情

(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)b秘密检查 0x80483ba处的断点1:文件ut_gdb.c,第6行。 (gdb)启动 0x804843c处的临时断点2:文件ut_gdb.c,第34行。 启动程序:ut.bin ut_gdb.c上的临时断点2,main():34 34 int res=0; (gdb)英国电信 #0 main()位于ut_gdb.c:34 (gdb)通话事实(3) 断点1,ut_gdb.c处的秘密检查(检查类型=1):6 6如果(检查类型==0){ 正在调试的程序在从GDB调用的函数中停止。 对包含函数的表达式的求值 (事实)将被放弃。 当函数完成执行时,GDB将静默停止。 (gdb)英国电信 #在ut_gdb.c:6进行0次秘密检查(检查类型=1) #1 0x080483ff在ut_gdb.c:19处的实际值(n=3) #2 #3位于ut_gdb.c的main():34
这是GDB中的一个限制吗?

我希望是这样。限制可能是GDB不能在停止(并且能够从停止继续)一次两个断点。GDB必须维护有关程序停止的当前点的信息才能继续。为了支持您尝试执行的操作,它需要维护一个“continue”堆栈状态,并且您可以指定要从哪一个继续。

使用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中,应该能够在模拟函数方面为您提供很多帮助(只是一个示例,我没有测试它):


你确定这不起作用吗?忽略你收到的长消息

对于我的例子,fn1调用fn2。我想测试fn1和模拟fn2:

b fn2
call fn1   
// gdb stops on the breakpoint
return somevalue
c
一切似乎都很好。(我使用cygwin gdb 7.8。)


请看:

将此功能添加到GDB中容易吗?我不是GDB开发人员,所以我不知道。但我想,从与他们一起工作的角度来看,这将是相当困难的。假设只有一个“continue”陈述而不是列出它们——如果我猜只有一个是正确的——可能会在整个程序中出现在各种各样的地方,你必须找到并修复它们。如果很容易,可能已经有人修复了。哦,哇,我今天正在尝试。我看到这个回复时已经很晚了。
b fn2
call fn1   
// gdb stops on the breakpoint
return somevalue
c