【问题标题】:Missing strlen_sse4.S results in Segmentation Fault缺少 strlen_sse4.S 导致分段错误
【发布时间】:2011-11-06 01:25:27
【问题描述】:

我正在编写一个用 c 编写的小工具,但遇到了我目前不知道如何解决的分段错误。在 GDB 中运行给了我以下提示:

程序收到信号 SIGSEGV,分段错误。 __strlen_sse42 () 在 ../sysdeps/x86_64/multiarch/strlen-sse4.S:32 ../sysdeps/x86_64/multiarch/strlen-sse4.S:找不到文件或目录 在 ../sysdeps/x86_64/multiarch/strlen-sse4.S (gdb) BT 0 __strlen_sse42 () 在 ../sysdeps/x86_64/multiarch/strlen-sse4.S:32 1 0x00007ffff764fed8 in strdup_and_subst_obj () from /usr/lib/libgvc.so.5 2 0x00007ffff7650631 in make_label () from /usr/lib/libgvc.so.5 3 0x00007ffff765a6d1 in common_init_node_opt () from /usr/lib/libgvc.so.5 4 0x00007ffff309d700 在 dot_init_node_edge () 来自 usr/lib/graphviz/libgvplugin_dot_layout.so.6 5 0x00007ffff309dcd8 in dot_layout () from /usr/lib/graphviz/libgvplugin_dot_layout.so.6 6 0x00007ffff7633a94 在来自 /usr/lib/libgvc.so.5 的 gvLayoutJobs () 7 0x00007ffff7639425 in gvLayout () from /usr/lib/libgvc.so.5 8 0x0000000000400eef in main ()

我会说:我缺少对我的系统或我的可执行文件(Ubuntu 11.04 64 位)的特定依赖关系非常感谢任何建议:]

我目前正在使用:

gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

编辑:

(gdb) 信息寄存器 拉克斯 0x6380e0 6521056 RBX 0x62dc14 6478868 回复 0x0 0 rdx 0x0 0 rsi 0x639770 6526832 rdi 0x0 0 rbp 0x639770 0x639770 回复 0x7fffffffd358 0x7fffffffd358 r8 0x0 0 r9 0x0 0 r10 0x7fffffffd140 140737488343360 r11 0x7ffff764fda0 140737343978912 r12 0x62dc14 6478868 r13 0x639770 6526832 r14 0x0 0 r15 0x7ffff7671d85 140737344118149 撕裂 0x7ffff6d7d49f 0x7ffff6d7d49f eflags 0x10246 [PF ZF IF RF] CS 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 GS 0x0 0

【问题讨论】:

  • 猜测一下:您的硬件不支持您的程序似乎使用的 SSE4。你能给出你编译的行吗?
  • 有可能。也许这也是与我使用的库(libgraphviz)有关的问题,因为我没有显式调用 sse4 的 api 或我的程序中的任何其他 SIMD 并行化。似乎由标准 ubuntu 存储库管理的当前版本的 libgraphviz 取决于此说明进行一些优化。但我不知道它的内部是如何组织的。
  • glibc-2.14 的 strlen-sse4.S 中的 FWIW 第 32 行是 pcmpeqb (%rdi), %xmm1,这只是一条 SSE2 指令。 OTOH,它是该函数中访问字符串的第一个位置。您能否在崩溃现场转储寄存器并将其附加到您的帖子(info registers)?
  • 我编辑了我的帖子以附加输出。我希望这就是你想要的信息。顺便提一句。我发现:在另一个项目(与此完全不同)中,当我在 C++ 中使用 Boost 时,我也遇到了同样的错误,它在那个地方使用 sse 进行算法优化。

标签: c graphviz sse


【解决方案1】:

分段错误通常是空指针取消引用。鉴于 libc 非常可靠,您很可能希望使用调试符号重新编译您的程序,并获取 libgvc 的 Ubuntu 软件包的调试变体。

“Missing strlen_sse4.S”只是调试器抱怨它找不到文件来为您提供崩溃站点的列表。您只需要获取 glibc 源代码的副本即可检查该文件。

【讨论】:

  • 啊,我明白了:所以它只是抱怨缺少调试符号以获取问题的更多详细信息。好的,我会按照这个提示进行的。
  • 我现在发现了我的问题,就是这样。我可能没有使用我的库的给定 API,它会导致空指针取消引用。在我之前的评论中提到的 Boost 问题完全是另一个问题,因为它运行在具有相同功能的更简单的程序中。
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多