JNI编程怎么跟踪调试dll?

简介: 本文主要讲解一下在jni开发中,如何调试C/C++编写的DLL模块。

原理


image.png

基于Windows操作系统的PE文件,理论是都是可以调试的,基于是否有源码,调试可以分为源码调试和二进制调试。在开发中,基本上都是使用源码进行调试,但是在一些逆向工程,或者没有源码的环境下则需要二进制调试,如使用Windbg、ollydbg等一些支持反汇编调试的调试工具,调试的原理就是调试器会在用户下断点对应的位置插入了Int3汇编指令,进行中断,有关调试的原理这里就不详阐述了。


调试过程


JNI调试其实就是源码调试技术,但是由于调用者是java程序,在Idea下貌似没有办法直接从Java的JNI接口进入C++实现函数进行调试,那么真的就无法调试了吗?当然不是,其实我们在使用VS编译生成二进制文件时,编译器会产生一个符号文件(*.pdb文件),只要调试器在调试该PE程序时,同时加载了这个pdb文件,那么调试器就会根据符号文件与源码进行匹配,从而实现源码调试。

1. 确保C++项目的编译选项中生成了pdb文件

image.png

2. 关闭编译优化

image.png

3. 查找java进程

编译完成后将生成的xxx.dll文件文件放入jni加载路径,运行java调用程序(最好先在java调用程序中下一个断点)。这时候,我们需要查找刚刚运行的进程?

这里我们可以利用两种方式查找运行进程:

  1. ProcessHacker找到该java进程的PID。
  2. 利用jps命令查找。

4. Attach Process

打开visual studio,并且打开DLL项目,使用Debug -> Attach Process的方式进行调试。

在进程列表中找到PID与java调用进程PID相同的java进程,点击Attache。

image.png


5. 调试

在代码中F9下断点,此时便可以放开IDEA中的断点,java进程在加载了DLL后,在运行至VS调试器设置的断点位置后,便会被断下,便可以开始调试。


image.png


注意


如果在java进程加载DLL后,断点无效,可以从两个方面排查:

  1. 调试的java进程不是调用者进程。
  2. java进程加载的DLL与该项目的pdb文件信息不匹配。
相关文章
|
Go Android开发 开发者
关于Xposed和Magisk的各方面比较(附Xposed框架各版本卡刷包及安装器)
说到搞机神器,不得不提江湖老大哥Xposed和后起之秀Magisk这两个框架,文章简单的介绍一下两者相似和不同之处
2187 0
|
NoSQL Redis 监控
redis-shake数据同步&迁移&备份导入导出工具使用介绍
redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。
72313 4
redis-shake数据同步&迁移&备份导入导出工具使用介绍
|
7月前
|
Cloud Native 关系型数据库 MySQL
华鼎冷链科技 × 阿里云瑶池数据库,打造全链路协同的智慧冷链新标杆
从 PolarDB 的高性能数据库服务到 AnalyticDB 的强大数据分析,阿里云提供的丰富产品矩阵为华鼎冷链科技构建了全面的解决方案,推动华鼎冷链科技从成本中心向效率中心转型。
|
8月前
|
存储 人工智能 自然语言处理
关于计算机视觉中的自回归模型,这篇综述一网打尽了
这篇综述文章全面介绍了自回归模型在计算机视觉领域的应用和发展。文章首先概述了视觉中的序列表示和建模基础知识,随后根据表示策略将视觉自回归模型分为基于像素、标记和尺度的三类框架,并探讨其与生成模型的关系。文章详细阐述了自回归模型在图像、视频、3D及多模态生成等多方面的应用,列举了约250篇参考文献,并讨论了其在新兴领域的潜力和面临的挑战。此外,文章还建立了一个GitHub存储库以整理相关论文,促进了学术合作与知识传播。论文链接:https://arxiv.org/abs/2411.05902
280 1
|
11月前
|
机器学习/深度学习 存储 自然语言处理
如何提升大模型的“深度思维能力”
本文探讨了如何通过模拟人类的思维过程来提升大模型的推理和规划能力。文章从人类的思维模式入手,分析了人类在面对复杂问题时的“增-减”信息循环,提出了通过增加相关信息和减少噪声来降低信息熵的方法。文章还讨论了如何生成逻辑自洽的推理路径,并通过实例说明了多结论问题的处理方法。最后,文章指出,通过现有的大模型进行针对性微调,可以逐步强化数据,提升模型的推理和规划能力。
889 11
|
缓存 关系型数据库 MySQL
Debian 11 x64 安装 MySQL 8.0.33
本文提供了一个逐步指南,介绍了如何在 Debian 11 x64 上下载和安装 MySQL 8.0.33。此外,还提供了允许远程访问的说明。
2431 1
Debian 11 x64 安装 MySQL 8.0.33
Qt控件(按钮、单选、复选、list、tree、table)
Qt控件(按钮、单选、复选、list、tree、table)
297 2
|
监控 负载均衡 安全
思科无线 LAN 控制器(WLC)基本配置详解
【4月更文挑战第22天】
2914 2
思科无线 LAN 控制器(WLC)基本配置详解
|
存储 关系型数据库 MySQL
debian11安装mysql5.7
debian11安装mysql5.7
666 0
|
网络协议 架构师 Linux
一文说透IO多路复用select/poll/epoll
一文说透IO多路复用select/poll/epoll
561 0