[发明专利]一种应用的调试方法及装置有效
申请号: | 201611129967.5 | 申请日: | 2016-12-09 |
公开(公告)号: | CN108614763B | 公开(公告)日: | 2022-01-04 |
发明(设计)人: | 周志刚 | 申请(专利权)人: | 武汉斗鱼网络科技有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京众达德权知识产权代理有限公司 11570 | 代理人: | 刘杰 |
地址: | 430000 湖北省武汉市东湖开*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 应用 调试 方法 装置 | ||
1.一种应用的调试方法,其特征在于,所述调试方法包括:
获取应用程序进程的DEBUG权限,对所述应用程序进程的权限提升,以使得所述应用程序进程具备设置调试寄存器的值的条件;
在所述应用程序中预设异常处理函数,其中,所述异常处理函数用于当应用程序抛出异常后,对异常进行处理,从而获取到设置的第一内存地址访问过的代码;
当第一内存地址被访问时,CPU会抛出一个异常,从所述CPU的IP寄存器中获取当前执行代码的第二内存地址,其中,所述第一内存地址为在应用程序进程的所有线程中设置硬件断点时设置的需要访问监控的内存地址,所述第二内存地址是监控的内存被访问的地址;
通过当前执行代码的第二内存地址,获取对应的模块信息,具体包括:
通过API函数VirtualQuery获取所述第二内存地址对应的动态链接库文件的句柄,并获取到对应的模块在内存中的基地址;
通过所述第二内存地址减去所述模块在内存中的基地址,以获取所述第二内存地址相对于所述模块的偏移;
通过所述句柄调用函数GetModuleBaseName获取模块信息;
将所述第二内存地址所在模块的偏移值及所述第二内存地址对应的模块信息发送至服务器;
通过所述模块信息和所述第二内存地址相对于对应的模块的偏移,获取对应的访问代码,以根据所述访问代码进行调试;
通过从配置服务器获取模块名称和偏移地址,并通过所述模块名称获取所述模块的起始地址,通过所述模块的起始地址和所述偏移地址,得到全局的第三内存地址,并将所述第三内存地址作为所述第一内存地址;其中,所述在应用程序进程的所有线程中设置硬件断点,具体包括:
通过API函数CreateToolhelp32Snapshot来获取线程的快照,并将其中参数设置为TH32CS_SNAPTHREAD;
通过API函数Thread32First来获取第一个线程的信息,所述线程的信息包括线程的ID和线程所属的进程ID,通过进程ID过滤不属于所述应用程序进程的线程;并通过API函数Thread32Next遍历到所有的线程;
对于每个线程通过调用API函数GetThreadContext来获取线程的上下文信息,并传入参数CONTEXT_DEBUG_REGISTERS,以获取线程上下文的寄存器信息;
设置寄存器的值以及设置需要监控的第一内存地址;通过API函数SetThreadContext将寄存器的值设置到线程的上下文中。
2.一种应用的调试装置,其特征在于,所述调试装置包括:
第一地址获取单元,用于获取应用程序进程的DEBUG权限,对所述应用程序进程的权限提升,以使得所述应用程序进程具备设置调试寄存器的值的条件;
在所述应用程序中预设异常处理函数,其中,所述异常处理函数用于当应用程序抛出异常后,对异常进行处理,从而获取到设置的第一内存地址访问过的代码;
当第一内存地址被访问时,CPU会抛出一个异常,从所述CPU的IP寄存器中获取当前执行代码的第二内存地址,其中,其中,所述第一内存地址为在应用程序进程的所有线程中设置硬件断点时设置的需要访问监控的内存地址,所述第二内存地址是监控的内存被访问的地址;
信息获取单元,用于通过当前执行代码的第二内存地址,获取对应的模块信息,具体包括:
通过API函数VirtualQuery获取所述第二内存地址对应的动态链接库文件的句柄,并获取到对应的模块在内存中的基地址;
通过所述第二内存地址减去所述模块在内存中的基地址,以获取所述第二内存地址相对于所述模块的偏移;
通过所述句柄调用函数GetModuleBaseName获取模块信息;
将所述第二内存地址所在模块的偏移值及所述第二内存地址对应的模块信息发送至服务器;
代码定位单元,用于通过所述模块信息和所述第二内存地址相对于对应的模块的偏移,获取对应的访问代码以根据所述访问代码进行调试;
内存地址设置,用于通过从配置服务器获取模块名称和偏移地址,并通过所述模块名称获取所述模块的起始地址,通过所述模块的起始地址和所述偏移地址,得到全局的第三内存地址,并将所述第三内存地址作为所述第一内存地址;
其中,所述在应用程序进程的所有线程中设置硬件断点,具体包括:
通过API函数CreateToolhelp32Snapshot来获取线程的快照,并将其中参数设置为TH32CS_SNAPTHREAD;
通过API函数Thread32First来获取第一个线程的信息,所述线程的信息包括线程的ID和线程所属的进程ID,通过进程ID过滤不属于所述应用程序进程的线程;并通过API函数Thread32Next遍历到所有的线程;
对于每个线程通过调用API函数GetThreadContext来获取线程的上下文信息,并传入参数CONTEXT_DEBUG_REGISTERS,以获取线程上下文的寄存器信息;
设置寄存器的值以及设置需要监控的第一内存地址;通过API函数SetThreadContext将寄存器的值设置到线程的上下文中。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于武汉斗鱼网络科技有限公司,未经武汉斗鱼网络科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201611129967.5/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种浏览器测试方法及装置
- 下一篇:IMA应用软件故障注入方法