Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA JNI C调试器_Java_C_Java Native Interface - Fatal编程技术网

JAVA JNI C调试器

JAVA JNI C调试器,java,c,java-native-interface,Java,C,Java Native Interface,是否有任何调试器可以帮助调试Java JNI程序和C库 我应该能够在Java中从静态void main开始调试程序,继续调试并在本机c函数中放置断点,然后在控件从c转移到Java后继续在Java中调试。Java虚拟机调试器与本机代码调试器非常不同。目前还没有一个成熟的解决方案,像同一个调试器那样,能够无缝地从Java到本机代码再返回。虽然这是一个非常刺激的问题,使得一些聪明的人试图开发这样一个解决方案,但毫无疑问,其中涉及大量无法想象的问题。我个人是这样做的: 在调试模式下启动Java代码,并在

是否有任何调试器可以帮助调试Java JNI程序和C库


我应该能够在Java中从静态void main开始调试程序,继续调试并在本机c函数中放置断点,然后在控件从c转移到Java后继续在Java中调试。

Java虚拟机调试器与本机代码调试器非常不同。目前还没有一个成熟的解决方案,像同一个调试器那样,能够无缝地从Java到本机代码再返回。虽然这是一个非常刺激的问题,使得一些聪明的人试图开发这样一个解决方案,但毫无疑问,其中涉及大量无法想象的问题。我个人是这样做的:

  • 在调试模式下启动Java代码,并在您感兴趣的第一个本机调用处设置断点。您甚至可以实现一个静态本机调用,它不会做任何有意义的事情,但可以让您尽快中断
  • 启动本机调试器。考虑到两个先决条件,这绝对可以是Eclipse的同一个实例:您安装了CDT,并且您的本机代码是以某种方式编译的,调试信息是CDT可以理解的。附加到运行java代码的
    java(w.exe)
    进程。在本机代码中放置断点
  • 每当您需要通过JNI接口进行转换时,请尽可能(或根据需要)将断点放在靠近调用入口/出口的位置

  • 我发现在IntelliJ IDEA调试器中运行java代码并设置一个非常早的断点可以将CLion的调试器连接到进程(在
    sudo echo 0>/proc/sys/kernel/yama/ptrace_scope
    之后)。然后,每个IDE将停止JVM,并在Java或JNI本机代码中的相应制动点处打开它的窗口,同时检查内存中任何上下文停止的对象。这使得体验相当顺利

    看看这个,我也在同一条船上。我实际上是SWT开发人员(Eclipse的接口在SWT中)。在SWT中,大约有30个地方JNI/C返回java。我们找到的唯一解决方案是添加一个被所有回调调用的方法,并在那里设置一个断点。