我有大量的 C++ 代码,我用 SWIG 包装了这些代码,并从 Java 中调用它。C++ 代码大量使用了 boost 智能指针。
我的一些 JUnit 测试完成了,但是在清理过程中遇到了段错误。堆栈跟踪表明对象的最终确定中存在内存错误,但它发生在 SWIG 生成的 JNI 代码中,并且似乎与智能指针引用计数相关联。
我希望能够单步执行代码的所有层。这可能吗?我也很高兴听到其他人在此类问题上的经历。
我有大量的 C++ 代码,我用 SWIG 包装了这些代码,并从 Java 中调用它。C++ 代码大量使用了 boost 智能指针。
我的一些 JUnit 测试完成了,但是在清理过程中遇到了段错误。堆栈跟踪表明对象的最终确定中存在内存错误,但它发生在 SWIG 生成的 JNI 代码中,并且似乎与智能指针引用计数相关联。
我希望能够单步执行代码的所有层。这可能吗?我也很高兴听到其他人在此类问题上的经历。
您可以将第二个本机代码调试器附加到正在执行的 Java 代码中。例如,使用 Visual Studio,您可以通过“调试>附加到进程”进行附加。
SWIG 支持智能指针,但您必须在 Java 端显式管理它们的生命周期。如果您在 Java 端获得了智能指针对象的所有权,则必须将其删除。请记住,Java 没有超出范围的对象临时对象,因此您将无法使用像 f().g().h() 这样的表达式,其中每个级别的返回值都是智能指针。
作为故障保险,如果发生垃圾回收,SWIG 生成的终结器将尝试为您删除它。如果对象已经在 C++ 端被删除,那么故障保护将是有害的。