如何使用gdb捕捉函数返回false的时刻?

如何使用gdb捕捉函数返回false的时刻?,gdb,Gdb,如何检测函数bool f()返回false的时刻 f具有复杂的if语句,这些语句返回true或false,为所有部分创建断点的成本很高。您可以尝试使用一些Python代码: import gdb class FunctionFinishBreakpoint (gdb.FinishBreakpoint): def __init__ (self): gdb.FinishBreakpoint.__init__(self, gdb.newest_frame(),

如何检测函数
bool f()
返回false的时刻


f
具有复杂的
if
语句,这些语句返回true或false,为所有部分创建断点的成本很高。

您可以尝试使用一些Python代码:

import gdb
class FunctionFinishBreakpoint (gdb.FinishBreakpoint):
    def __init__ (self):
        gdb.FinishBreakpoint.__init__(self, gdb.newest_frame(), 
                                      internal=True)
        self.silent = True 

    def stop(self):
        #print("after: {}".format(int(self.return_value)))
        return not int(self.return_value)

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

    def stop (self):
        #print("before")
        FunctionFinishBreakpoint() # set breakpoint on function return

        return False # do not stop at function entry

FunctionBreakpoint("test")
将其保存在
finish.py
文件中,根据您的需要进行编辑并从GDB中获取源代码,或者在
python之间运行它。。。结束
或在python interactive中(
pi

此代码创建一个
FunctionBreakpoint
,该断点触发
FunctionBreakpoint。每次命中
test
函数时,停止。回调是静默的,只创建一个
FunctionFinishBreakpoint
,该断点在当前帧的末尾停止(即,在函数的末尾)。第二个stop调用
函数finishbreakpoint.stop
,该函数测试返回值的计算结果是否为true或false。如果它是“非真”,它会告诉GDB停止执行

文件参考:

gdb.FinishBreakpoint
被添加到gdb-Python接口就是为了这个目的,我自己:-)

(上次我检查时,这些FinishBreakpoint存在效率问题,如果经常调用函数,您可能会注意到)

的可能重复