如何查看ruby c扩展回溯信息

时间:2015-12-05 10:03:35

标签: c ruby

这里是我的输出,我不明白十六进制“0xe8”和“0x7f8c783ac74d”;

/home/roroco/Dropbox/rbs/ro_article/c/ro_helper_article.so(get_article_n2+0xe8) [0x7f8c783ac74d]

here是完整输出

1 个答案:

答案 0 :(得分:1)

看起来你已经(或者更确切地说,一个插件引起的)ruby会导致段错误。这通常意味着您已经尝试访问指定范围之外的内存 - 基本上,您的程序确实做了一些非常非常奇怪的事情。您专门挑选的行实际上是一个C库 - .so扩展名为“static object”,并链接到主ruby可执行文件中。它为您提供的信息告诉您错误的来源 - 但是,大多数生产库不包含诸如“文件名”和“行号”之类的信息。相反,它们包含list of symbols。在您的情况下,它会在静态对象中确切地告诉您错误的来源 - 0xe8符号后面的get_article_n2个字节 - 或地址0x7f8c783ac74d

所以现在你有几个选择。

  1. 你可以在你的源代码中盲目地浏览(我假设你在这里编写了错误的库,因为它似乎是你正在测试的)并试着猜测段错误的起源。考虑到该符号后面的错误,您已经知道它位于函数get_article_n2中。

  2. 您可以反汇编静态对象以查看导致错误的特定指令,然后尝试将其映射到源。

  3. 您可以启用调试,并使您的构建系统输出文件名和行号,以便您知道您正在查看的内容。 (免责声明:我不确定这是否有效;看起来你不向我发出调试信息,但我不确定你是不是;即使你愿意,我也是我不确定它会用于输出。但是,这似乎是最简单的行动方案。)