sha*_*awn 5 java java-native-interface assembly jvm jrockit
我有一个C DLL,它使用JNI代理任何对底层java程序的调用,该程序进行实际的举重.我动态加载jrockit jvm.dll来进行函数调用.
供应商A有一个C#DLL实际调用我的C DLL而另一个供应商B有一个C#程序调用供应商A的C#DLL.
使用供应商A的C#DLL进行测试时没有任何问题,但是在与供应商B的C#程序集成后,我通过JNI_CreateJavaVM初始化JVM的调用会使整个程序崩溃.
任何帮助,将不胜感激.
我收到的错误消息是:
[ERROR] Could not find allocated thread local data key in TIB
[ERROR] Could not create fast TLD
JRockit aborted: Unspecified Error(52)
Assertion failed: Could not create fast tld
In vmDebug Before Abort() (src/jvm/runtime/debug/debug.c:103)
Run Code Online (Sandbox Code Playgroud)
编辑1:确定我已经反汇编了jvm.dll并且它调用TlsAlloc后跟TLSSet并且到达显示错误消息的代码,cmp esi,edx在第二个图像中的je SHORT 04755D4B之前必须不相等.
第一图像中的调用04755DD0的内容在第二图像中.
有谁知道之前的计算(操纵esi和edx的1)有什么作用?

编辑2 :(作为对PT的回应)我没有设置任何特定的线程系统,因此我认为它使用的是默认的线程系统,这是原生的,如下所示:http://docs.oracle.com/cd/E13222_01/ WLS/docs81b/JRockit的/ threads.html
您的猜测很可能是正确的,在查看反汇编时,我发现代码逻辑是这样的,它首先调用TlsAlloc,然后调用TlsSetValue将TlsAlloc返回的索引处的线程本地存储设置为常量幻数4711之后,它从线程信息块的开头使用eip循环查找值4711,一旦找到它,代码再次调用TlsSetValue将值设置为1147,此时它检查eip是否实际指向通过确保[eip]设置为1147来确定线程本地存储.
供应商B正在使用C#作为他们的程序,因此,他们将使用CLR虚拟机.一旦它到达供应商B调用我的DLL的点,他们就已经初始化了WPF棱镜和mef框架,将所有接口模块加载到它们各自的位置,初始化所有单例(在WPF prism术语中导出)模型并初始化MS工作流程.但是,当我将初始化代码转移到前几行时,jvm成功进行了初始化(这不是初始化jvm的正确位置,我们还没有测试其余的代码是否正常工作).
当TlsSetValue失败时,代码只分支到错误,TlsSetValue是否有任何原因失败?在供应商B的代码中我应该注意什么可能导致问题?
我遇到了同样的错误,并且我设法弄清楚发生了什么,至少就我而言是这样。它看起来像是 JRockit 中的一个错误,您的问题对于调查它非常有帮助。
对放置在槽中的“幻数”执行的搜索延伸到从 TEB 开头开始的两页数据。然而,TEB 本身只有 64 个插槽的存储空间。请参阅http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686708(v=vs.85).aspx。
如果分配的存储槽的索引为 64 或更高,Windows 不会将数据放入嵌入数组中,而是将其放入 TlsExpansionSlots 指针指向的块中。由于它位于 TEB 之外,因此对幻数的搜索失败,并且 JRockit 会产生此错误。
我的这个例子也发生在 .NET 程序中。我的猜测是,CLR 大量使用了 TLS,因此更有可能分配高槽号。
就我而言,JRockit 在尝试写入日志行时实际上崩溃了,可能是因为它发生得太早以至于日志尚未创建。不确定您使用的是哪个版本的 JRockit。我的是:
C:\>java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
BEA JRockit(R) (build R27.6.5-32_o-121899-1.6.0_14-20091001-2107-windows-ia32, compiled mode)
Run Code Online (Sandbox Code Playgroud)
不知道以后的修改中是否修复了这个问题。如果不是,我们(即我的雇主)可能不得不向 Oracle 提出这个问题。
| 归档时间: |
|
| 查看次数: |
2115 次 |
| 最近记录: |