GDB:将参数转储到特定函数的所有调用
GDB: dump arguments to all calls of a specific function
我需要分析在我的程序中作为参数传递给标准 C 库函数 sqrt() 的值。
简单的方法是在实际调用 sqrt()(例如简单的 fprintf())之前插入代码以将这些值转储到文件中。但是,如果从库内部调用 sqrt(),或者从多个位置调用它,任务可能会变得困难。
有没有办法在 GDB 或其他调试工具中自动执行此操作?
在此先感谢您的帮助。
此致。
当然可以。有简单的方法也有困难的方法。
最简单的方法是如果您有 sqrt
的调试信息。大多数发行版都提供此功能;例如,对于 Fedora,您可以使用 debuginfo-install
来安装它。
在这种情况下,找到有问题的函数,在其上设置断点,并让断点命令打印参数:
break sqrt
commands
silent
info args
cont
end
如果您有足够新的 gdb,并且您知道参数的名称,则可以改用 dprintf
命令。这将为您提供更好的格式,并且不会与 next
.
等其他调试命令交互不良
困难的方法是如果您没有调试信息。在这种情况下,您需要了解平台 ABI。然后你仍然可以设置断点,然后打印相应的寄存器或转储相应的内存,具体取决于参数的传递方式。
还有一种方法是使用 SystemTap。对于这种跟踪,这是一个非常好的工具。
我需要分析在我的程序中作为参数传递给标准 C 库函数 sqrt() 的值。
简单的方法是在实际调用 sqrt()(例如简单的 fprintf())之前插入代码以将这些值转储到文件中。但是,如果从库内部调用 sqrt(),或者从多个位置调用它,任务可能会变得困难。
有没有办法在 GDB 或其他调试工具中自动执行此操作?
在此先感谢您的帮助。
此致。
当然可以。有简单的方法也有困难的方法。
最简单的方法是如果您有 sqrt
的调试信息。大多数发行版都提供此功能;例如,对于 Fedora,您可以使用 debuginfo-install
来安装它。
在这种情况下,找到有问题的函数,在其上设置断点,并让断点命令打印参数:
break sqrt
commands
silent
info args
cont
end
如果您有足够新的 gdb,并且您知道参数的名称,则可以改用 dprintf
命令。这将为您提供更好的格式,并且不会与 next
.
困难的方法是如果您没有调试信息。在这种情况下,您需要了解平台 ABI。然后你仍然可以设置断点,然后打印相应的寄存器或转储相应的内存,具体取决于参数的传递方式。
还有一种方法是使用 SystemTap。对于这种跟踪,这是一个非常好的工具。