无法使用Python调用GDB用户定义的函数

时间:2015-08-17 14:56:06

标签: python linux debugging gdb

我使用Python API为GDB定义了一个便利函数,

import gdb

verbose = True

class HCall(gdb.Function):
    def __init__(self, funcname):
        super(HCall,self).__init__(funcname)

    def log_call(cmd):
        if verbose:
            print(cmd)
        try:
            gdb.execute(cmd)
        except Exception, e:
            print (e)
            import traceback
            # traceback.print_stack()
            traceback.format_exc()


class NewCVar(HCall):
   """ allocates a c variable in heap """
   def __init__(self):
       super(NewCVar,self).__init__("newcvar")

   def invoke(self, name, oftype):
       cmd = "call gdb.execute(set $" + name + " = malloc(sizeof(" + oftype + "))"
       log_call(cmd)
       return "$" + name

NewCVar()

我可以使用“source usefunction.py”加载此文件,并使用“function newcvar”打印帮助文本。然而,正如我所期望的那样,GDB并不知道$ newcvar。https://sourceware.org/gdb/onlinedocs/gdb/Functions-In-Python.html

有没有人知道我能做错什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

你应该准确地发布会发生什么,以及你期望发生什么。

我在gdb中尝试了你的程序,gdb确实看到了这个函数;但由于函数中存在错误,因此实际上并不起作用。例如,我试过:

(gdb) p $newcvar("x", "int")
Traceback (most recent call last):
  File "/tmp/q.py", line 23, in invoke
    cmd = "call gdb.execute(set $" + name + " = malloc(sizeof(" + oftype + "))"
gdb.error: Argument to arithmetic operation not a number or boolean.
Error occurred in Python convenience function: Argument to arithmetic operation not a number or boolean.

错误是你试图gdb.execute一个看起来像call gdb.execute(...)的字符串。这很奇怪。 call计算下级中的表达式,因此将其与包含gdb.execute的参数一起使用是不正确的。相反,NewCVar.invoke应该生成类似set variable $mumble = ...的字符串。

在这里返回一个字符串也很奇怪。

我想知道你为什么要将它作为一个函数而不是一个新的gdb命令。