【发布时间】: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 进行算法优化。