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