我正在尝试通过带有 WinDBG 的 JNI 调试在基于 Java 的服务进程中运行的 C++ 组件中的访问冲突错误。我目前面临两个问题:
- Java 本身使用第一次机会访问冲突异常来执行一些内部线程同步(至少看起来是这样),所以我不能只打破所有第一次机会访问冲突(根据 Java 错误数据库,这是预期的行为,所以我们不应该期待任何修复)
- 异常在外部代码中处理(应该保护生产环境免受 C++ 代码的不当行为)
目前,我看到了一种区分 Java 的 AV 和我的 AV 的方法 - Java 发生在属于没有加载任何符号的模块的地址,或者在内存的任何其他点,我有兴趣捕捉发生的 AV在已加载符号的地方。
似乎我有关于如何使用 WinDbg 实现它的所有元素,但无法将它们组装在一起:
sxe -c ".if (ln) {gN}" av
问题是我无法在 .if 语句中指定 ln 命令的输入(因为它需要一个表达式),而且我不确定如何检查 ln 的输出是否为空。