如何调试 jni dll

how to debug a jni dll

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

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

  • 在Ollydbg
  • 中加载"java.exe"
  • 转到 "Options > options" 菜单 (ALT + O)。
  • 在选项 window 上,在左侧菜单中转到 "Debugging > Events"
  • 勾选"Pause on new module (DLL)"
  • (可选)检查 "Only on the following modules"(否则调试器将中断所有加载的模块,包括系统模块)。
  • 单击 "Add" 按钮并在框中填写您的 dll 名称。
  • 单击 "Debugging events" window
  • 底部的 "OK"

  • 如果您想将一些参数传递给 java.exe,请转到 "File > Set new arguments" 菜单。
  • 重新启动程序 (CTRL + F2),这是使更改生效所必需的。
  • 运行 程序,当你加载 jni dll 时(在 DLL main 上)它应该中断。
  • 按"CTRL + N"查看您的DLL导出的名称
    • 注意:您实际上可以在此 window
    • 上键入要搜索的名称
    • 看起来像这样(使用 kernel32.dll 系统 DLL 的示例,我在 window 上键入了 "CreatefileW":

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