Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: ytf   发起时间: 2009-10-27 15:36 下午   回复: 9

Print Search
帖子排序:    
   2009-10-27, 15:36 下午
ytfrdfiw 离线,最后访问时间: 2016/10/9 6:24:20 ytf

发帖数前100位
注册: 2009-03-01
发 贴: 10
bpload 如何在windbg下实现
Reply Quote

张老师:

       你好!

       上次在上海的openparty上请教了一下softice下bpload在windbg下的实现。你回答是通过Event Filter来实现。我现在按照如下步骤来做,但去无法实现,请教了。步骤如下:

1、在host机器上,选择Debugging-->event filter的Load module,设置 Argument为“Kernel32.dll”或者是我自己的一个“1.dll”;设置Execution为enable,continue为Handled.

2、在虚拟机上,随便启动一个进程,因为一般会加载Kernel32.dll,但我始终无法中断到host的debugger上。

3、查看启动的进程,肯定加载了Kernel32.dll或1.dll,而且肯定1.dll一定是整个操作系统里第一次加载的dll。因为kernel32.dll一般不会是第一次,我排除了这种可能性。

我的环境是:host:vista64+windbg amd64

                   debuggee :xp 32 sp2


IP 地址: 已记录   报告
   2009-10-27, 20:00 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: bpload 如何在windbg下实现
Reply Quote

你描述的是内核调试会话,而Kernel32.dll是个用户态模块,所以没有如你所期望的中断到调试器。如果想继续在内核会话试验,那么可以试验一个驱动模块。如果想监视用户态DLL加载,那么可以调试一个应用程序,在用户态会话中做实验。


IP 地址: 已记录   报告
   2009-11-02, 09:06 上午
ytfrdfiw 离线,最后访问时间: 2016/10/9 6:24:20 ytf

发帖数前100位
注册: 2009-03-01
发 贴: 10
Re: bpload 如何在windbg下实现
Reply Quote
首先谢谢张老师的回答。
你回答“你描述的是内核调试会话”是什么意思,难道说event filter只能用于内核事件?bpload可以实现用户态的DLL的断点到调试器。我要实现的是我并不知道自己写的Dll被哪个应用程序调用了。所以通过调试应用程序无法实现做到。
IP 地址: 已记录   报告
   2009-11-02, 12:50 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: bpload 如何在windbg下实现
Reply Quote

多谢客气(很多人问问题很凶的:-))

event filter可以用于内核事件,也可以用于用户态,但是内核会话通常不处理用户态事件,这是为了防止频繁的用户态事件影响内核调试,要知道内核调试是依赖双机通信的,每次中断到调试器至少要花毫秒级的时间,因此这是by design。

对于你的问题,如果你真想通过内核调试来解决这个问题,那么可以在nt!DbgkMapViewOfSection(《软件调试》P199)设个条件断点。

其实,不知道你要解决什么问题:

如果是DLL在某个进程中崩溃,那么可以用JIT调试;

如果只在某个进程中有问题,那么可以在启动这个进程时自动启动调试器;

如果在所有进程中都有问题,那么可以使用用户态会话随便调试一个进程;

如果想挑战一下WinDBG的功能到底有多强,那么它就这个样...... :-)

 

 


IP 地址: 已记录   报告
   2009-11-02, 13:41 下午
ytfrdfiw 离线,最后访问时间: 2016/10/9 6:24:20 ytf

发帖数前100位
注册: 2009-03-01
发 贴: 10
Re: bpload 如何在windbg下实现
Reply Quote
谢谢张老师的回答。
我的要求是这样的,我的Dll会通过下钩子的方式注入到其他进程中,但有时会导致计算机有问题,但我不知道是哪个进程被注入了DLL,所以有这个要求。我可以试试你说的nt!DbgkMapViewOfSection这个方法。
你的《软件调试》写得很好,我买了一本。谢谢你的经验分享!
IP 地址: 已记录   报告
   2009-11-02, 16:43 下午
Coding 离线,最后访问时间: 2010/2/20 12:12:52 Coding

发帖数前10位
注册: 2008-05-31
发 贴: 103
Re: bpload 如何在windbg下实现
Reply Quote
既然你有代码,为何不加个print语句打印是什么process呢。
或者除了问题以后看你的dll在那些process里面呢?

这样一个条件断点会很大的降低系统性能的。
IP 地址: 已记录   报告
   2009-11-03, 08:50 上午
ytfrdfiw 离线,最后访问时间: 2016/10/9 6:24:20 ytf

发帖数前100位
注册: 2009-03-01
发 贴: 10
Re: bpload 如何在windbg下实现
Reply Quote
谢谢你的回答,你的回答是一种思路,但有一个问题,我不只是想知道哪个进程加载了该Dll,更想调试该dll,因为无法调试该进程(该进程稍纵即逝),不能使用open executive这个方法来做,使用此方法,该dll工作可以达到预期,但在某种条件下,同样的进程加载该dll运行没有达到预期。
IP 地址: 已记录   报告
   2009-11-03, 09:19 上午
Coding 离线,最后访问时间: 2010/2/20 12:12:52 Coding

发帖数前10位
注册: 2008-05-31
发 贴: 103
Re: bpload 如何在windbg下实现
Reply Quote
我的思路是,先找出是什么进程导致了问题,是否是一个固定的进程。如果是,就用一个user mode的调试。
所导致的问题是否是应为执行了dll内的一些代码,如果是在一个恰当的地方加入一个__debugbreak();的断点尝试是否能抓住现场。

"计算机有问题"是什么样子的问题,知道了具体问题是什么样子的,也许有更好的地方来抓住现场。

IP 地址: 已记录   报告
   2009-11-03, 13:46 下午
ytfrdfiw 离线,最后访问时间: 2016/10/9 6:24:20 ytf

发帖数前100位
注册: 2009-03-01
发 贴: 10
Re: bpload 如何在windbg下实现
Reply Quote
谢谢你的回答,你的这种思路是可行的。只是需要在源代码加个debugbreak而已。谢谢!

不过我们避开这个问题而言,windbg是否能直接实现?
IP 地址: 已记录   报告
   2009-11-05, 09:41 上午
ytfrdfiw 离线,最后访问时间: 2016/10/9 6:24:20 ytf

发帖数前100位
注册: 2009-03-01
发 贴: 10
Re: bpload 如何在windbg下实现
Reply Quote
再顶一下。不知其他人有没有什么好方法,如果通过张老师那种方法,则会断点很多次,不知道条件断点如何设置。一般我会设置。这个不会,呵呵。
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: bpload 如何在windbg下实现

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.