我使用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。
有没有人知道我能做错什么?
提前致谢!
答案 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命令。