Mac用JVM命令查看进程出现 DebuggerException: Can‘t attach symbolicator to the process

本文讲述了在使用JDK8时遇到的符号性连接到进程的问题,解决方法是升级到更高版本的JDK,同时指出原项目对JDK引用无需改变。附带展示了使用jinfo和jmap进行调试的相关配置。

localhost:~ littleCute$ jinfo -flags 10726

Attaching to process ID 10726, please wait...

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach symbolicator to the process

sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach symbolicator to the process

at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.execute(BsdDebuggerLocal.java:169)

at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach(BsdDebuggerLocal.java:287)

at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)

at sun.jvm.hotspot.HotSpotAgent.setupDebuggerDarwin(HotSpotAgent.java:659)

at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:341)

at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)

at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)

at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)

at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)

at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)

at sun.tools.jinfo.JInfo.main(JInfo.java:76)

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach symbolicator to the process

at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach0(Native Method)

at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.access$100(BsdDebuggerLocal.java:65)

at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$1AttachTask.doit(BsdDebuggerLocal.java:278)

at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.run(BsdDebuggerLocal.java:144)
 问题的来源是JDK8会妨碍正在运行的JVM, 再装个高版本的JDK就可以调试了,原项目JDK的引用不用变。
localhost:~ littleCute$ java -version
java version "20.0.2" 2023-07-18
Java(TM) SE Runtime Environment (build 20.0.2+9-78)
Java HotSpot(TM) 64-Bit Server VM (build 20.0.2+9-78, mixed mode, sharing)

 此时,我们就可以用jinfo、jmap调试了

localhost:~ littleCute$ jinfo -flags 11443
VM Flags:
-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:CompressedClassSpaceSize=44040192 -XX:InitialHeapSize=134217728 -XX:+ManagementServer -XX:MaxHeapSize=2147483648 -XX:MaxMetaspaceSize=52428800 -XX:MaxNewSize=715653120 -XX:MetaspaceSize=52428800 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC

当海康 SDK 调用回调方法时出现 `JNA: Can't attach native thread to VM for callback: -1` 错误,通常与 Java 虚拟机(JVM)和本地线程的交互有关。以下是一些可能的解决办法: ### 检查 JVM 初始化和线程附着 确保 JVM 已经正确初始化,并且在回调方法中正确附着和分离当前线程。如引用[2]中所示,在回调方法中需要正确获取 JNI 环境并附着和分离线程: ```c static void java_callback(int time) { JNIEnv* jenv = NULL; jvm->GetEnv((void**)&jenv, JNI_VERSION_1_2); __android_log_print(ANDROID_LOG_INFO, "jni", "attach thread"); jvm->AttachCurrentThread(&jenv, NULL); __android_log_print(ANDROID_LOG_INFO, "jni", "run thread body %d", time); jenv->CallStaticVoidMethod(cls, method); __android_log_print(ANDROID_LOG_INFO, "jni", "detach thread"); jvm->DetachCurrentThread(); } ``` 确保 `jvm`、`cls` 和 `method` 等变量已经正确初始化。 ### 检查 JNA 配置 确保 JNA 库已经正确配置,并且版本兼容。有时候,不兼容的 JNA 版本可能会导致线程附着问题。可以尝试更新 JNA 到最新版本,或者使用与海康 SDK 兼容的特定版本。 ### 检查线程安全 确保在回调方法中不会出现线程安全问题。如果多个线程同时访问 JVM 或者共享资源,可能会导致线程附着失败。可以使用同步机制(如 `synchronized` 关键字)来确保线程安全。 ### 检查权限和环境 确保应用程序具有足够的权限来访问 JVM 和执行本地代码。在 Android 环境中,可能需要检查权限配置和运行环境。 ### 调试和日志记录 在回调方法中添加详细的日志记录,以便更好地跟踪问题。可以使用 Android 的日志工具(如 `__android_log_print`)或者 Java 的日志框架(如 `java.util.logging` 或 `SLF4J`)来记录详细的调试信息。 ### 示例代码 以下是一个简单的示例,展示了如何在 JNA 回调方法中正确附着和分离线程: ```java import com.sun.jna.Callback; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; public class HikvisionSDKExample { public interface MV_CC_RegisterImageCallBackEx_cbOutput_callback extends Callback { void apply(Pointer pData, Pointer pFrameInfo, Pointer pUser); } public interface HikvisionSDK extends Library { int MV_CC_RegisterImageCallBackEx(Pointer handle, MV_CC_RegisterImageCallBackEx_cbOutput_callback cbOutput, Pointer pUser); } public static void main(String[] args) { HikvisionSDK sdk = Native.load("HikvisionSDK", HikvisionSDK.class); MV_CC_RegisterImageCallBackEx_cbOutput_callback callback = new MV_CC_RegisterImageCallBackEx_cbOutput_callback() { @Override public void apply(Pointer pData, Pointer pFrameInfo, Pointer pUser) { // 在这里添加线程附着和分离逻辑 // ... } }; Pointer handle = null; // 假设 handle 已经正确初始化 Pointer pUser = null; // 假设 pUser 已经正确初始化 int result = sdk.MV_CC_RegisterImageCallBackEx(handle, callback, pUser); if (result != 0) { System.err.println("注册回调方法失败: " + result); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值