从 gdbinit 脚本单步执行时如何设置跳过不感兴趣的函数?

Posted

技术标签:

【中文标题】从 gdbinit 脚本单步执行时如何设置跳过不感兴趣的函数?【英文标题】:How to set skipping of uninteresting functions while stepping from gdbinit script? 【发布时间】:2015-08-12 08:26:17 【问题描述】:

我正在尝试设置一组功能,以便 gdb 跳过以下命令的介入:

skip myfunction

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

找不到名为 myfunction 的函数。

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

所以我需要 GDB 来获得Y 的答案。我已经尝试过suggested for breakpoints 和set confirm off 在对this question 的评论中建议的内容。但是这些对skip 命令没有帮助。

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

【问题讨论】:

【参考方案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(或在 .gdbinit 中用 python ... end 包围),然后:

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

文档参考:

GDB Python TOC Basic Python Events in Python Symbols in Python

【讨论】:

@Ruslan 我已经更新了代码,现在可以使用现成的了:-)【参考方案2】:

此功能已在此处提出:

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

到目前为止,6 个月来没有关于该问题的活动。在撰写本文时,该功能尚未包含在 GDB 7.10 中。

【讨论】:

根据我有限的经验,即使是 GDB 的错误报告中的补丁也会被忽略,除非发送到 gdb-patches 邮件列表。所以看起来如果补丁有效,它必须由用户手动应用...... 嗯,事实上这甚至不是一个补丁——只是一个源文件,没有任何关于它应该驻留在哪里以及如何将它包含在 GDB 构建系统中的提示。 这是您所说的邮件列表吗? sourceware.org/ml/gdb-prs/2015-q2/msg00417.html 不,我的意思是 gdb-patches,如上所述。这个:sourceware.org/ml/gdb-patches .

以上是关于从 gdbinit 脚本单步执行时如何设置跳过不感兴趣的函数?的主要内容,如果未能解决你的问题,请参考以下文章

postman 批量执行时怎么把部分接口跳过不执行

避免在 Chrome 开发者工具中单步执行 javascript 文件?

如何从 .gdbinit 强制断点?

myEclipse调试(Debug)方法

如何从.gdbinit强制断点?

键盘录入nextLine()跳过不执行