【问题标题】:how to debug a jni dll如何调试一个jni dll
【发布时间】:2016-08-10 15:05:45
【问题描述】:

我有一个小的 java 程序。它加载一个 jni dll,该 dll 加载一个普通的 win32 dll。我想调试Java应用程序最终为win32 dll的一个特定调用提供了哪些参数。我的计划是在 ollydbg 中的这个 DLL 调用上放置一个断点,然后检查堆栈。但是当我在 ollydbg 中启动调试模式时,我必须提供一个可执行文件,所以我唯一的选择是为 java.exe 提供参数来启动我的 java 程序。但是我只能在最终加载 DLL 时在 DLL 中设置断点,这需要我基本上运行程序。我看不出我怎么不能“停止”执行来设置断点,如果我能以某种方式停止,我就不需要断点。谁能告诉我我需要做什么?

【问题讨论】:

  • 您使用的是什么 IDE,IDE 的版本是什么?
  • "但是我只能在最终加载 DLL 时在 DLL 中设置断点"。不对。不知道其他 IDE,但 Visual Studio 也会在之前设置的断点处中断。
  • @JFF:我正在尝试 ollydbg,但我似乎无法加载 DLL。我必须从可执行文件开始。否则我会尝试 Visual Studio Express Edition

标签: java java-native-interface ollydbg


【解决方案1】:

您可以指示调试器在加载特定 dll 时中断。

  • 在 Ollydbg 中加载“java.exe”
  • 转到“选项 > 选项”菜单 (ALT + O)。
  • 在选项窗口的左侧菜单中,转到“调试 > 事件”
  • 选中“暂停新模块 (DLL)”
  • (可选)选中“仅在以下模块上”(否则调试器将中断所有加载的模块,包括系统模块)。
  • 单击“添加”按钮并在方框中填写您的 dll 名称。
  • 点击“调试事件”窗口底部的“确定”

  • 如果您想将一些参数传递给 java.exe,请转到“文件 > 设置新参数”菜单。
  • 重新启动程序 (CTRL + F2),需要将更改考虑在内。
  • 运行程序,当你加载 jni dll 时它应该会中断(在 DLL main 上)。
  • 按“CTRL + N”查看 DLL 导出的名称
    • 注意:您实际上可以在此窗口中输入要搜索的名称
    • 看起来像这样(以 kernel32.dll 系统 DLL 为例,我在窗口中键入“CreatefileW”):

  • 在要中断的函数名称上按 F2(这会在函数上放置一个断点)
  • 用 F9 运行程序:如果函数被调用,这应该会中断。

【讨论】:

  • @kaidentity 很高兴我能帮上忙!还在事件窗口中添加了Check "Only on the following modules" 的精度。如果您有时间,请告诉我一切是否按预期进行。
  • @Neista:你使用的是哪个 ollydbg 版本?我尝试了 10 和 20,但都无法指定要暂停的模块。
  • 我的断点没有命中。难道断点与暂停模块加载不兼容?
  • @kaidentity :不,应该工作正常(当调试器在模块加载时停止时,我在设置 BP 时从未遇到过问题)。您确定调用了函数(设置断点的位置)吗?设置软件断点相当于设置一个 int3,它总是会被调试器捕获(否则一切都会崩溃)。你有办法从你的本机代码进行调试打印吗?不过,您可能想尝试设置硬件 BP,但我怀疑这会改变什么……
  • 现在工作。我在所有相关调用上设置了 BP,然后它起作用了,我得到了我正在寻找的信息,即使我不能说我只是对这些东西很熟悉.. 一遍又一遍地重新启动 java 和 ollydbg.. .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多