Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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的本机调用跟踪的问题_Java_C++_Java Native Interface_Windbg - Fatal编程技术网

关于使用Java的本机调用跟踪的问题

关于使用Java的本机调用跟踪的问题,java,c++,java-native-interface,windbg,Java,C++,Java Native Interface,Windbg,我们正在调试导致Tomcat web应用程序崩溃的错误。 该应用程序通过jni使用2个第三方应用程序,其中一个使用SmartHeap(它是c/c++应用程序的内存管理库),另一个不使用(它是webMethods broker版本5) 奇怪的是,我在崩溃日志中看到webMethods调用其本机方法来启动到代理服务器的连接,但是如果我使用WinDbg(加载JVM崩溃时创建的minidump文件)打印崩溃发生的线程的调用跟踪,它包含对SmartHeap函数的调用。现在我觉得我有点迷路了。。。因为我已经

我们正在调试导致Tomcat web应用程序崩溃的错误。 该应用程序通过jni使用2个第三方应用程序,其中一个使用SmartHeap(它是c/c++应用程序的内存管理库),另一个不使用(它是webMethods broker版本5)

奇怪的是,我在崩溃日志中看到webMethods调用其本机方法来启动到代理服务器的连接,但是如果我使用WinDbg(加载JVM崩溃时创建的minidump文件)打印崩溃发生的线程的调用跟踪,它包含对SmartHeap函数的调用。现在我觉得我有点迷路了。。。因为我已经检查过了,没有从webMethods二进制文件中找到对此dll的引用

(实际上是调用内存分配)

我的问题是这怎么可能

我的意思是任何人都可以描述这部分是如何工作的?因为我认为解释/编译框架和本机框架是按固定顺序调用的(这是合乎逻辑的)

  • 可能调用堆栈无效?(现在我们有许多具有几乎相同调用跟踪的转储文件)
  • 或者调用跟踪(本机函数的调用顺序)是有效的,只有一些函数在调用之前被重新排序(比如在将其发送到webMethods代理之前必须生成惰性对象,但我没有看到任何迹象)
我通过调用“.ecxr”和“kv”查询转储文件上的调用跟踪,输出为:

0:060> .ecxr
eax=4d330554 ebx=4d350010 ecx=4d330010 edx=00000000 esi=4d350010 edi=00000000
eip=4c912f15 esp=4bf1dad0 ebp=3574884d iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
shsmp!shi_allocSmall2+0x195:
4c912f15 8b4d00          mov     ecx,dword ptr [ebp]  ss:0023:3574884d=????????
0:060> k
*** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr  
4bf1daec 4c912bbd shsmp!shi_allocSmall2+0x195
4bf1dafc 4c91b973 shsmp!MemAllocPtr+0x5d
*** WARNING: Unable to verify checksum for awssl50jn.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for awssl50jn.dll - 
4bf1db14 49abc38d shsmp!shi_malloc_dbg+0x23
WARNING: Stack unwind information not available. Following frames may be wrong.
4bf1db3c 49abeca2 awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0xa1cd
4bf1db48 49ab5e66 awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0xcae2
4bf1db4c 49ab5e55 awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0x3ca6
4bf1db60 49ab667d awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0x3c95
4bf1db80 49abdbbc awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0x44bd
4bf1dc20 4c912f4f awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0xb9fc
4bf1dc78 49abd607 shsmp!shi_allocSmall2+0x1cf
00000000 00000000 awssl50jn!Java_COM_activesw_api_client_ssl_AwSSLNative_getSecurityInfo+0xb447`

任何帮助都将不胜感激

也许SmartHeap有一个“功能”,即将自身作为进程的唯一分配器插入?您能否发布
~\s;的输出;。exr-1;千伏
?您是如何检查引用的?@Thomas,我已经检查了上述命令的输出,它打印了以下内容:@Thomas,谢谢您的回复!我已经检查了上述命令的输出,它打印了有关异常的正确数据,但是调用跟踪属于minidump文件的写入(它包含以下内容:dbghelp!MiniDumpWriteDump+0x2470),它不包含属于异常报告中提到的函数的任何行。我认为这是因为首先我们必须切换到正确的线程,而且似乎是
。ecxr
这样做的。(对不起,我刚过去5分钟,我是新来的…)谢谢@bmargiles,我想因为JVM正在工作,并且它使用MSVCR100.dll,这不可能是真的,但我会询问他们这一点,以确保。。。已经向SoftwareAG询问过是否使用SmartHeap的webMethods,但因为这是一个古老的版本,他们无法提供信息(我认为他们从版本6购买了wM,所以他们可能真的没有这方面的信息)