我想在我的.gdbinit中自动执行以下操作:

break boost::uuids::detail::sha1::process_bytes

# When execution stops at the above breakpoint,
# I want to display the contents of `rcx` as a string:
x/s $rcx
c  # do not stop here


如何自动执行此操作?

更新:这是一个更好的.gdbinit示例:

# Our custom-built libcurl, with debugging symbols enabled:
set environment LD_PRELOAD=./curl/curl-7.34.0/lib/.libs/libcurl.so

# File that connects to the evil server:
file ./evil

# Make sure we get notified when it connects!
break curl_easy_setopt
commands $bpnum
clear curl_easy_setopt  # to avoid recursion
call curl_easy_setopt(curl, CURLOPT_VERBOSE)
continue
end


此钩子连接到邪恶的二进制文件,并且在初始化其curl句柄时,将其设置为冗长,因此我们可以了解到发生的一切。

谢谢您的回答。

#1 楼

很简单。在您的情况下,您最可能需要的是commands,可用于创建在遇到断点时运行的“例程”。大致适合您的情况:

break boost::uuids::detail::sha1::process_bytes
commands 1
x/s $rcx
continue
end


问题是您需要对断点号进行硬编码。根据GDB版本的不同,您可以使用便捷变量$bpnum来解决此问题。因此:

break boost::uuids::detail::sha1::process_bytes
commands $bpnum
x/s $rcx
continue
end


也请参见最后一个示例。

注意:使用此方法可能会对CPU造成很大的负担,具体取决于如何通常会调用此方法,以及GDB是否可以使用硬件断点。


还可以使用条件形式的断点。在此处查看实际的权威参考。格式如下:使用info break获取断点的编号,然后将其用作bnum,用于:

break ... if cond