考虑this gist。我已经检查并仔细检查了这段代码的缺陷,并且在代码中找不到任何明显的缺陷。当我使用g++ -g -std=c++11 -Wall dynlibtest.cc -ldl -lffi -lstdc++ -odynlibtest && ./dynlibtest
时,它也可以正常编译(-ldl
和-lffi
开关分别用于动态加载和FFI库。)
但是,当突出显示的行(l.96)执行segfaults时。
我也试过通过gdb拉它,在安装了libc调试符号后,当./dynlibtest
bin segfaults:
(gdb)next
编程接收信号SIGSEGV,分段故障。 __memcpy_sse2_unaligned()at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:157 157 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:没有这样的文件或目录。
谁能帮助我理解为什么会出现这种段错误?它是某种类型的错误还是我使用了API之一的错误?
供参考:代码的第一部分直接调用gettimeofday
以显示代码确实可以找到它,并且即使args在直接调用时也是正确的。
编辑:当代码段错误与bt
的输出也附加时,我添加了gdb输出:
$ gdb ./dynlibtest
GNU gdb(Ubuntu 7.7.1-0ubuntu5~14.04.2)7.7.1
版权所有(C)2014 Free Software Foundation,Inc。
许可证GPLv3 +:GNU GPL版本3或更高版本http://gnu.org/licenses/gpl.html
这是免费软件:您可以自由更改并重新分发它 在法律允许的范围内,不提供任何担保。输入“显示复制”
并详细说明“保修” 此GDB配置为“x86_64-linux-gnu” 输入“show configuration”以获取配置详细信息 有关错误报告说明,请参阅:
http://www.gnu.org/software/gdb/bugs/。
在线查找GDB手册和其他文档资源:
http://www.gnu.org/software/gdb/documentation/。
如需帮助,请输入“帮助” 输入“apropos word”以搜索与“word”相关的命令...
从./dynlibtest...done读取符号。
(gdb)破96 断点1在0x401032:文件dynlibtest.cc,第96行。
(gdb)运行
启动程序:/ home / j / dev / elisp-ffi / dynlibtest
测试开始......
得到主程序句柄
预分配:tv.tv_sec = 140737340592552
睡1秒钟 post-alloc:tv.tv_sec = 1432058412
睡1秒钟 Fn ptr call:tv.tv_sec = 1432058413
FFI CIF准备好了 睡1秒钟 断点1,main()at dynlibtest.cc:96
96 ffi_call(& cif,FFI_FN(gettimeofday),& result,args);
(gdb)下一个 程序接收信号SIGSEGV,分段故障 __memcpy_sse2_unaligned()at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:157
157 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:没有这样的文件或目录。
(gdb)bt
#0 __memcpy_sse2_unaligned()at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:157
memcpy中的#1 0x00007ffff79d34c2(__ len = 8,__src = 0x0,__ destination = 0x7fffffffda48)/usr/include/x86_64-linux-gnu/bits/string3.h:51
#2 ffi_call(cif = 0x7fffffffdca0,fn = 0x400ab0,rvalue = 0x7fffffffdc40,avalue = 0x7fffffffdc00)at ../src/x86/ffi64.c:504
在dynlibtest.cc:96的main()中#3 0x000000000040104e (gdb)