Java JVM 的 native 方法如何进行监控

2022-07-25 22:10:15 +08:00
 L0L

Java 问题,目前遇到了一个比较奇怪的问题:

  1. 内部公司使用了一些奇怪安全软件,登录了账号后,发现 IDEA 打不开了;
  2. 通过 JvisualVM 监控到一个 windows native 的本地方法发生了堵塞,CPU 达到了 100%;
  3. 写了一个简单的案例,去调用这个方法,发现确实会在扫描大量文件时发生堵塞。

想找到一种方式查看到当前 jvm ( windows 平台)的 C++的方法调用栈的情况呢? 具体是那个位置造成了死循环(目前看 jdk 层 java 代码未产生死循环)。

方法名是 WindowsNativeDispatcher.CreateFile0 ,通过 JDK 源码,找到了 natvie 方法的 c 文件

下面是具体代码:

JNIEXPORT jlong JNICALL
Java_sun_nio_fs_WindowsNativeDispatcher_CreateFile0(JNIEnv* env, jclass this,
    jlong address, jint dwDesiredAccess, jint dwShareMode, jlong sdAddress,
    jint dwCreationDisposition, jint dwFlagsAndAttributes)
{
    HANDLE handle;
    LPCWSTR lpFileName = jlong_to_ptr(address);

    SECURITY_ATTRIBUTES securityAttributes;
    LPSECURITY_ATTRIBUTES lpSecurityAttributes;
    PSECURITY_DESCRIPTOR lpSecurityDescriptor = jlong_to_ptr(sdAddress);


    if (lpSecurityDescriptor == NULL) {
        lpSecurityAttributes = NULL;
    } else {
        securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
        securityAttributes.lpSecurityDescriptor = lpSecurityDescriptor;
        securityAttributes.bInheritHandle = FALSE;
        lpSecurityAttributes = &securityAttributes;
    }

    handle = CreateFileW(lpFileName,
                        (DWORD)dwDesiredAccess,
                        (DWORD)dwShareMode,
                        lpSecurityAttributes,
                        (DWORD)dwCreationDisposition,
                        (DWORD)dwFlagsAndAttributes,
                        NULL);
    if (handle == INVALID_HANDLE_VALUE) {
        throwWindowsException(env, GetLastError());
    }
    return ptr_to_jlong(handle);
}
1739 次点击
所在节点    Java
3 条回复
ysc3839
2022-07-25 22:13:12 +08:00
用调试器附加就能看了,比如 x64dbg 。
不过需要有调试符号才能看到函数名。如果是系统 DLL 可以从微软服务器加载调试符号。
L0L
2022-07-25 22:16:05 +08:00
@ysc3839 感谢朋友,我去学习下这个工具
codefever
2022-07-25 22:55:32 +08:00
jstat ,可以实时监测系统资源占用与 jvm 运行情况

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868658

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX