在JNI模块中调试特定的访问冲突

时间:2012-06-07 09:02:35

标签: debugging java-native-interface windbg access-violation

我正在尝试通过JDB和WinDBG调试在基于Java的服务进程中运行的C ++组件中的访问冲突错误。 我目前面临两个问题:

  1. Java本身使用第一次机会访问冲突异常来进行一些内部线程同步(至少看起来是这样),所以我不能打破所有第一次机会访问冲突(根据Java bug数据库,这是打算行为,所以我们不应该期待任何修复)
  2. 异常在外部代码中处理(应该保护生产环境免受C ++代码行为不端)。
  3. 目前我看到区分Java的AV和我的一种方法 - Java正在发生在属于没有加载任何符号的模块的地址,或者在内存的任何其他位置,并且我有兴趣捕获在加载了符号的地方发生的AV。

    似乎我有关于如何使用WinDbg实现它的所有元素,但无法将它们组合在一起:

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

    问题是我无法在.if语句中指定ln命令的输入(因为它需要一个表达式),而且我也不确定如何检查ln的输出是否为空。

2 个答案:

答案 0 :(得分: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&gt; “RebaseAddr”

答案 1 :(得分:0)

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