2012-06-07 75 views
3

我试图通过JNI和WinDBG在基于Java的服务进程中运行的C++组件中调试访问冲突错误。 有我目前面临两个问题:在JNI模块中调试特定的访问冲突

  1. Java本身使用了第一次机会访问冲突异常做一些内部的线程同步化(至少这是怎么好像),所以我不能只在所有一线突破机会访问冲突(根据Java的漏洞数据库,这是预期的行为,所以我们不应该指望任何修复)
  2. 异常外码的处理(即应该保护生产环境免受C++代码行为不端)

目前我看到了一种区分Java的AV和我的方式 - Java是偶然的在属于没有加载任何符号的模块或存储器的任何其他位置的地址处,并且我有兴趣捕获在具有符号加载的地方发生的AV。

好像我对如何使用WinDbg来实现它的所有元素,但不能聚集在一起他们:

sxe -c ".if (ln) {gN}" av

问题是我不能。如果语句中指定ln命令的输入(因为它期望表达式),并且我不确定如何检查ln的输出是否为空。

回答

4

有趣的案例!我认为使用ln并检查输出会非常慢(并且不知道怎么做)。稍微不同的方法: 伪@ $ IP应该包含异常

First chance exceptions are reported before any exception handling. 
<cut cut > 
eip=0041625d 
0:000> r @$ip 
$ip=0041625d 

使用rebase utility的地址,以便为您的.dll的更改默认加载地址到一个较高的值,并希望他们都装起来有。

然后你就可以测试:@ $ IP>“RebaseAddr”

0

我们有一个加载的jvm.dll并调用它原生C++服务。从它的AV吨:-(幸运的是,他们总是从jvm.dll里面最多两个不同的指令,所以我做sxe -c ".if (@eip == <addr1>) || (@eip == <addr2>) {gn}" av,这对我很有用。