即使参数看起来正确,对ffi_call的调用也会失败

时间:2015-05-19 17:45:09

标签: c c++11 ffi

考虑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)

0 个答案:

没有答案