如何在从gdbinit脚本步进时跳过不感兴趣的函数?

时间:2015-08-12 08:26:17

标签: debugging gdb

我正在尝试设置一组要被gdb跳过的函数,例如:

skip myfunction

。但是,如果我将它们放在~/.gdbinit而不是仅仅在终端gdb提示符中说,我收到错误:

  

找不到名为myfunction的函数。

     

忽略未来共享库加载的函数? (y或[n])[回答N;输入不是来自终端]

所以我需要GDB来获得Y回答。我已经尝试了对suggested for breakpoints的评论中提出的this questionset confirm off内容。但这些对skip命令没有帮助。

如何在skip脚本中设置.gdbinit,回答关于未来库加载的Y

2 个答案:

答案 0 :(得分:1)

此功能已在此处提出:

https://sourceware.org/ml/gdb-prs/2015-q2/msg00417.html https://sourceware.org/bugzilla/show_bug.cgi?id=18531

到目前为止,在这个问题上已经有6个月没有活动了。在编写本文时,该功能未包含在GDB 7.10中。

答案 1 :(得分:1)

您可以使用Python等待执行开始,这相当于pending on

import gdb

to_skip = []

def try_pending_skips(evt=None):
    for skip in list(to_skip): # make a copy for safe remove
        try:
            # test if the function (aka symbol is defined)
            symb, _ = gdb.lookup_symbol(skip)
            if not symb:
                continue
        except gdb.error:
            # no frame ?
            continue
        # yes, we can skip it
        gdb.execute("skip {}".format(skip))
        to_skip.remove(skip)

    if not to_skip:
        # no more functions to skip
        try:
            gdb.events.new_objfile.disconnect(try_pending_skips) # event fired when the binary is loaded
        except ValueError:
            pass # was not connected

class cmd_pending_skip(gdb.Command):
    self = None

    def __init__ (self):
        gdb.Command.__init__(self, "pending_skip", gdb.COMMAND_OBSCURE)

    def invoke (self, args, from_tty):
        global to_skip

        if not args:
            if not to_skip:
                print("No pending skip.")
            else:
                print("Pending skips:")
                for skip in to_skip:
                    print("\t{}".format(skip))
            return

        new_skips = args.split()
        to_skip += new_skips

        for skip in new_skips:
            print("Pending skip for function '{}' registered.".format(skip))

        try:
            gdb.events.new_objfile.disconnect(try_pending_skips) 
        except ValueError: pass # was not connected

        # new_objfile event fired when the binary and libraries are loaded in memory
        gdb.events.new_objfile.connect(try_pending_skips)

        # try right away, just in case
        try_pending_skips()

cmd_pending_skip()

将此代码保存到Python文件pending_skip.py中(或python ... end中的.gdbinit包围),然后:

source pending_skip.py
pending_skip fct1
pending_skip fct2 fct3
pending_skip # to list pending skips

文档参考:

相关问题