|
|
|
|
|
|
|
C/C++本地代码调试
帖子发起人: ytf 发起时间: 2009-10-27 15:36 下午 回复: 9
|
帖子排序:
|
|
|
|
2009-10-27, 15:36 下午
|
ytf
注册: 2009-03-01
发 贴: 10
|
|
|
张老师:
你好!
上次在上海的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-11-02, 09:06 上午
|
ytf
注册: 2009-03-01
发 贴: 10
|
|
|
首先谢谢张老师的回答。
你回答“你描述的是内核调试会话”是什么意思,难道说event filter只能用于内核事件?bpload可以实现用户态的DLL的断点到调试器。我要实现的是我并不知道自己写的Dll被哪个应用程序调用了。所以通过调试应用程序无法实现做到。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-02, 12:50 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
多谢客气(很多人问问题很凶的:-))
event filter可以用于内核事件,也可以用于用户态,但是内核会话通常不处理用户态事件,这是为了防止频繁的用户态事件影响内核调试,要知道内核调试是依赖双机通信的,每次中断到调试器至少要花毫秒级的时间,因此这是by design。
对于你的问题,如果你真想通过内核调试来解决这个问题,那么可以在nt!DbgkMapViewOfSection(《软件调试》P199)设个条件断点。
其实,不知道你要解决什么问题:
如果是DLL在某个进程中崩溃,那么可以用JIT调试;
如果只在某个进程中有问题,那么可以在启动这个进程时自动启动调试器;
如果在所有进程中都有问题,那么可以使用用户态会话随便调试一个进程;
如果想挑战一下WinDBG的功能到底有多强,那么它就这个样...... :-)
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-02, 13:41 下午
|
ytf
注册: 2009-03-01
发 贴: 10
|
|
|
谢谢张老师的回答。
我的要求是这样的,我的Dll会通过下钩子的方式注入到其他进程中,但有时会导致计算机有问题,但我不知道是哪个进程被注入了DLL,所以有这个要求。我可以试试你说的nt!DbgkMapViewOfSection这个方法。
你的《软件调试》写得很好,我买了一本。谢谢你的经验分享!
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-02, 16:43 下午
|
Coding
注册: 2008-05-31
发 贴: 103
|
|
|
既然你有代码,为何不加个print语句打印是什么process呢。
或者除了问题以后看你的dll在那些process里面呢?
这样一个条件断点会很大的降低系统性能的。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-03, 08:50 上午
|
ytf
注册: 2009-03-01
发 贴: 10
|
|
|
谢谢你的回答,你的回答是一种思路,但有一个问题,我不只是想知道哪个进程加载了该Dll,更想调试该dll,因为无法调试该进程(该进程稍纵即逝),不能使用open executive这个方法来做,使用此方法,该dll工作可以达到预期,但在某种条件下,同样的进程加载该dll运行没有达到预期。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-03, 09:19 上午
|
Coding
注册: 2008-05-31
发 贴: 103
|
|
|
我的思路是,先找出是什么进程导致了问题,是否是一个固定的进程。如果是,就用一个user mode的调试。
所导致的问题是否是应为执行了dll内的一些代码,如果是在一个恰当的地方加入一个__debugbreak();的断点尝试是否能抓住现场。
"计算机有问题"是什么样子的问题,知道了具体问题是什么样子的,也许有更好的地方来抓住现场。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-03, 13:46 下午
|
ytf
注册: 2009-03-01
发 贴: 10
|
|
|
谢谢你的回答,你的这种思路是可行的。只是需要在源代码加个debugbreak而已。谢谢!
不过我们避开这个问题而言,windbg是否能直接实现?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-11-05, 09:41 上午
|
ytf
注册: 2009-03-01
发 贴: 10
|
|
|
再顶一下。不知其他人有没有什么好方法,如果通过张老师那种方法,则会断点很多次,不知道条件断点如何设置。一般我会设置。这个不会,呵呵。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » C/C++本地代码调试 » bpload 如何在windbg下实现
|
|
|
|
|
|