【问题标题】:listing all calls to my library列出对我的图书馆的所有调用
【发布时间】:2011-04-25 11:43:49
【问题描述】:

我正在用 C 语言构建一个共享库,供其他程序使用。有时,这些其他程序会因为我的共享库中的一些错误而崩溃。在重现这些错误时,了解我的库中的哪些函数被调用、使用什么参数以及以什么顺序调用对我来说非常有用。当然,我可以在我的所有函数中添加printf() 调用,或者为所有函数添加断点,但我认为必须有更好的方法来确定这一点。

编辑:由于我在 OSX 上执行此操作,dtrace 和相关脚本 dapptrace 似乎很有希望。但是,在浏览了一些文档之后,我仍然有点迷茫。

假设,我的库是 /path/to/libmystuff.so,我有一个链接到该库的程序 test。使用 dtrace,我将如何显示驻留在 libmystuff.so 中的所有函数调用的列表?

【问题讨论】:

    标签: c debugging shared-libraries dtrace


    【解决方案1】:

    如果您在 Linux 系统上工作,您可以为此目的使用 ltrace。原始海报在下面的 cmets 中展示了一个使用 dtrace 在 Mac OS X 上运行的解决方案。

    【讨论】:

    • 对不起,我没有提到这一点,但我主要在 OSX 上。然而,对 osx 的 ltrace 的搜索让我找到了dtrace,这似乎很有希望。谢谢你的提示!
    • 我已在您的答案中添加了dtrace 的正确用法,因此我可以接受。
    • @Rodin,不要修改其他人的答案,除非是为了澄清文本、改进语法或重新格式化。如果您觉得他们的回答需要更多信息,您可以在评论中提供并建议他们添加。
    • 对于 dtrace,这个命令可以解决问题:dtrace -n 'pid$target:libmystuff::entry {}' -c ./test 如果添加到答案中,我可以接受。
    • 我选择将读者指向 cmets 中的解决方案,而不是在我的答案中复制它。我希望这能让每个人都满意。 @Rodin,感谢您接受答案。
    【解决方案2】:

    我假设您正在使用 Unix。 使用gdb 进行调试。 如果你的程序崩溃了。 您可以使用生成的核心文件来查看堆栈跟踪。 它将提供您要求的所有信息。

    有关使用 gdb 和核心文件检查堆栈跟踪的更多信息,请参阅here.

    【讨论】:

    • 这会让我看到对我的库进行的所有调用,还是只看到导致崩溃的一个调用?
    【解决方案3】:

    您还可以记录文件系统上的函数调用以及函数名称、参数等所有详细信息。 (通常日志记录对服务器客户端应用程序有帮助,但我不确定您的应用程序)。 这样您就可以跟踪所有呼叫。您也可以仅在调试模式下启用日志记录。希望这个回复对你有用。

    【讨论】:

    • 我可以在不手动向我的所有函数中添加fwrite() 调用的情况下执行此操作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2015-12-11
    • 1970-01-01
    • 2018-06-18
    • 2015-01-20
    相关资源
    最近更新 更多