阅读:2221回复:4
请教pci驱动程序不稳定,偶尔发生蓝屏的问题
我用driverstudio 3.2写了一个windows 2003 的pci驱动程序。当测试时发现在某些机器下能正常运行,可到了其他机器上就经常发生蓝屏。我用windbg跟踪了蓝屏发生前的状况,发现函数调用栈的内容也是莫名其妙的,不过好像每次发生问题它都会停在inline ULONG& KIrp::WriteSize(EStackLocation s)函数的ValidateStackLocation(s);处,有时又会在m_pAdapter->PutScatterGatherList(m_pScatterGather, m_dir == FromMemoryToDevice);处。不知该如何下手。而且开始的一段时间内数据都能成功地收发,也就是整个读写工作都能走过几轮,但是工作了一会儿,它就蓝屏了。请问有没有好的工具跟踪一下。另外pci驱动程序会不会跟主板的型号有关联?该如何判断呢?
|
|
总版主
|
沙发#
发布于:2009-05-29 22:27
你提供的这些信息无助于让别人帮助你发现蓝屏的原因。其实类似这种不确定的蓝屏的情况,几乎没有什么人可以帮助你。除非别人也刚好碰到过几乎完全一样的情况。
我经历过许多的蓝屏,有明显的也有隐晦的。有100%出现的也有要几个月才能出现一次的。当根据蓝屏出现处的调试信息无法找到线索的时候,本人只有一个方法,这个方法屡试不爽,帮助我解决了几乎所有的bug,并且让我始终被认为是团队里能善于调试和解决bug的人。 因为目前你有一份能够蓝屏的版本。同时,无论如何你都得找出一份不蓝屏的代码来。无论删除多少功能、无论隐蔽掉多少个分支,甚至只剩下最简单的框架。那么这两份代码之间的差异,中间一定有导致蓝屏的根源。请逐步的同步这些差异,直到找到导致蓝屏发生的那个差异为止。无论看上去某个差异多么的自然,多么的安全,和蓝屏多么的没有关系,都不要放过它。逐个测试,迟早可以定位错误的位置。一旦定位了,问题很快将大白于天下。这看似最土的方法,但是我却觉得这是最有效的。 有的人总觉得调试程序有什么秘诀,有什么神奇的技术。但是实际上,在从未见到过的实际问题面前,无论多深厚的理论基础,或者实战经验,都比不上耐心和毅力更加有用。 |
板凳#
发布于:2009-06-02 21:48
感谢二楼牛人对我的回答。现在我已经把驱动程序裁减得已经是最精简的了,只剩下dma的操作。目前的状况是dma读写工作一段时间后仍然会蓝屏。蓝屏时的调试信息和函数栈为:
BAD_POOL_CALLER (c2) The current thread is making a bad pool request. Typically this is at a bad IRQL level or double freeing the same allocation, etc. Arguments: Arg1: 00000007, Attempt to free pool which was already freed Arg2: 00001163, (reserved) Arg3: 00260000, Memory contents of the pool block Arg4: 8c2a3008, Address of the block of pool being deallocated Debugging Details: ------------------ POOL_ADDRESS: 8c2a3008 Nonpaged pool FREED_POOL_TAG: Hal BUGCHECK_STR: 0xc2_7_Hal DEFAULT_BUCKET_ID: DRIVER_FAULT PROCESS_NAME: Idle CURRENT_IRQL: 2 LAST_CONTROL_TRANSFER: from 80826967 to 80871f24 STACK_TEXT: 8089a05c 80826967 00000003 00000000 00000000 nt!RtlpBreakWithStatusInstruction 8089a0a8 8082786b 00000003 00000001 8c2a3000 nt!KiBugCheckDebugBreak+0x19 8089a440 80827c63 000000c2 00000007 00001163 nt!KeBugCheck2+0x5e1 8089a460 808927bb 000000c2 00000007 00001163 nt!KeBugCheckEx+0x1b 8089a4c8 80a5b2ef 8c2a3008 00000000 8cecacc4 nt!ExFreePoolWithTag+0x477 8089a4ec 809bca69 8cecaea8 8d11c18c 8c2a3001 hal!HalPutScatterGatherList+0xe3 8089a514 baccd190 8cecaea8 8c2a3028 8c2a3001 nt!VfPutScatterGatherList+0x6b KDmaAdapter::PutScatterGatherList+0x20 KDmaTransfer::CompleteLastTransfer+0xf3 通过查看KDmaTransfer类的成员变量m_pScatterGather,发现m_pScatterGather指向的那块空间我也没有做free操作啊。不知道为什么经常会随机地发生蓝屏。另外,请问针对这种现象我最好应该怎样调试?期待牛人的回答。谢谢。 |
|
地板#
发布于:2010-05-20 13:45
顶,我也遇到类似的情况,用winbug跟踪蓝屏前状态,发现在KDmaTransfer类中的continue函数出现问题,请问这是怎么回事。还有,蓝屏现象也是发生在N次读取数据后
|
|
地下室#
发布于:2010-08-12 17:01
加入Driver Verifier可以加快重现蓝屏,也可以更好定位,另外那个内存Free的地址太怪异了。正常情况应该没有这种地址才对。
|
|