从 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 脚本单步执行时如何设置跳过不感兴趣的函数?的主要内容,如果未能解决你的问题,请参考以下文章