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



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

    Java
  1. 本身使用首次机会访问违规异常来执行一些内部线程同步(至少看起来是这样),所以我不能只是中断所有第一次访问违规(根据 Java 错误数据库这是预期行为,所以我们不应该期望任何修复)
  2. 异常
  3. 在外部代码中处理(应保护生产环境免受C++代码行为异常的影响)

目前,我看到了一种区分 Java 的 AV 和我的 AV 的方法 - Java 发生在属于未加载任何符号的模块的地址,或者发生在内存的任何其他点,我有兴趣捕获发生在加载符号的地方的 AV。

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

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

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

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

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

使用 rebase 实用程序将.dll的默认加载地址更改为高值,并希望它们都加载到那里。

然后你可以测试: @$ip> "RebaseAddr"

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

最新更新