【问题标题】:JNI thread causing SIGSEGV Cypress fx2lp USB chipJNI 线程导致 SIGSEGV Cypress fx2lp USB 芯片
【发布时间】:2015-10-23 21:34:11
【问题描述】:

我可以用什么方法来调试这个 JNI 代码?我看到它指出有问题的框架是 writeUSB 函数,但我没有看到任何问题。这个 Java 应用程序是为 Mac 编写的,它们是一个 JNI,用于与我们内部制造的硬件进行通信。我们硬件中的 USB 芯片来自 cypress fx2lp Cy64713。我不确定为什么这会导致 SIGSEGV ...

在这里完整转储 http://pastebin.com/BbgK796a

此 JNI 的完整来源在这里 https://bitbucket.org/snippets/partialdata/6L69r/ucs30interfacejni

当我插入硬件时,这是 netbeans 中的调试器控制台,打开它然后调试应用程序。

http://pastebin.com/TkyqZxus

【问题讨论】:

  • 运行 IDE 的 C++ 调试器。运行java程序。将调试器附加到 java 程序的进程。等待崩溃。哦,不要在网站外发布代码,因为当其他网站改变它的链接或死亡时,它会使这个问题及其答案变得毫无价值。将代码嵌入到这篇文章中。如果代码太适合问题,你有两个问题,第一个是崩溃,另一个是缺少MCVE
  • 我查看了链接。这不是代码。没有代码调试代码非常非常困难。

标签: java c++ macos java-native-interface netbeans-8


【解决方案1】:

向下滚动到堆栈跟踪的这一部分非常有用:

Stack: [0x000070000011a000,0x000070000021a000],  sp=0x0000700000218010,  free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [UCS30InterfaceJNI.dylib+0x1146]  _Z8writeUSBPP20IOUSBInterfaceStructPhi+0x46
C  [UCS30InterfaceJNI.dylib+0xfcc]  _Z15getSerialNumberPP20IOUSBInterfaceStruct+0x6c
C  [UCS30InterfaceJNI.dylib+0x2b19]  _Z14findUSBDevicesPc+0x259
C  [UCS30InterfaceJNI.dylib+0x2f40]  Java_ucs30interface_Main_findUCS30s+0x40
j  ucs30interface.Main.findUCS30s()Ljava/lang/String;+0

尽管 C++ 编译器对参数名称进行了一些修改,但您可以看到程序失败时调用的函数的名称。 最上面的匹配类似 writeUSB(IOUSBInterfaceStruct**,int*) 的函数。找到一个类似的函数并寻找它使用指针的地方。该函数中的一个指针可能指向从未分配或已被释放的内存。

更新

如果您在顶级函数中看不到问题,则可能是在调用它的函数中。例如,如果调用它的函数 (getSerialNumber) 使用可能导致相同 SIGSEGV 的错误指针调用它。在带有 Netbeans 8.1 RC2 的 Linux 上,我可以使用调试器从 java 代码逐步转换为 C++ 代码。您可以在 Mac 上试用它,但我不确定它是否有效。如果没有调试器,您可以使用 printf。在每一行代码之间放置一个。出现的打印在坏线之前,没有出现的打印在坏线之后。您应该确保所有 printf 的结尾都以\n 结尾,并且您刷新标准输出,否则当 SIGSEGV 发生时,打印可能仍会被缓冲。您还可以将函数拆分为从该函数调用的更小的函数,这也有助于缩小范围。打印变量的值。作为字符串的命令需要在它来自的数组末尾之前有一个终止 0。您可能需要查看调用代码才能知道该数组有多长。接口作为指向指针的指针可能会通过成为错误指针或指向错误指针而导致失败。问题可能出在函数 writeUSB 调用(如 WritePipe)中,如果该函数被内联,它可能不会显示在堆栈跟踪中。

【讨论】:

  • 请重新阅读我的原帖... 我已经声明我已经调查了 writieUSB 功能,它似乎没问题。我不明白的是如何解决从我的 java 应用程序调用的 JNI 问题,以便我可以进一步调试 JNI。我在这里处理 C++ 和 Java...
  • 抱歉,您已经看到了 writeUSB 。添加了一些其他的尝试。
  • 谢谢!我将使用您的提示,看看我能弄清楚什么。我也在与 Cypress 合作......最终我相信我将不得不重写这个 JNI......
  • 更新了 netbeans 调试器信息的原始帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2014-11-05
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多