wangyj44064
驱动牛犊
驱动牛犊
  • 注册日期2009-01-13
  • 最后登录2009-11-13
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望71点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2221回复:4

请教pci驱动程序不稳定,偶尔发生蓝屏的问题

楼主#
更多 发布于:2009-05-28 23:45
我用driverstudio 3.2写了一个windows 2003 的pci驱动程序。当测试时发现在某些机器下能正常运行,可到了其他机器上就经常发生蓝屏。我用windbg跟踪了蓝屏发生前的状况,发现函数调用栈的内容也是莫名其妙的,不过好像每次发生问题它都会停在inline ULONG& KIrp::WriteSize(EStackLocation s)函数的ValidateStackLocation(s);处,有时又会在m_pAdapter->PutScatterGatherList(m_pScatterGather, m_dir == FromMemoryToDevice);处。不知该如何下手。而且开始的一段时间内数据都能成功地收发,也就是整个读写工作都能走过几轮,但是工作了一会儿,它就蓝屏了。请问有没有好的工具跟踪一下。另外pci驱动程序会不会跟主板的型号有关联?该如何判断呢?
XiangXiangRen
总版主
总版主
  • 注册日期2003-02-22
  • 最后登录2015-09-01
  • 粉丝13
  • 关注0
  • 积分1042分
  • 威望472点
  • 贡献值1点
  • 好评度145点
  • 原创分13分
  • 专家分1分
沙发#
发布于:2009-05-29 22:27
你提供的这些信息无助于让别人帮助你发现蓝屏的原因。其实类似这种不确定的蓝屏的情况,几乎没有什么人可以帮助你。除非别人也刚好碰到过几乎完全一样的情况。
我经历过许多的蓝屏,有明显的也有隐晦的。有100%出现的也有要几个月才能出现一次的。当根据蓝屏出现处的调试信息无法找到线索的时候,本人只有一个方法,这个方法屡试不爽,帮助我解决了几乎所有的bug,并且让我始终被认为是团队里能善于调试和解决bug的人。
因为目前你有一份能够蓝屏的版本。同时,无论如何你都得找出一份不蓝屏的代码来。无论删除多少功能、无论隐蔽掉多少个分支,甚至只剩下最简单的框架。那么这两份代码之间的差异,中间一定有导致蓝屏的根源。请逐步的同步这些差异,直到找到导致蓝屏发生的那个差异为止。无论看上去某个差异多么的自然,多么的安全,和蓝屏多么的没有关系,都不要放过它。逐个测试,迟早可以定位错误的位置。一旦定位了,问题很快将大白于天下。这看似最土的方法,但是我却觉得这是最有效的。
有的人总觉得调试程序有什么秘诀,有什么神奇的技术。但是实际上,在从未见到过的实际问题面前,无论多深厚的理论基础,或者实战经验,都比不上耐心和毅力更加有用。
wangyj44064
驱动牛犊
驱动牛犊
  • 注册日期2009-01-13
  • 最后登录2009-11-13
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望71点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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操作啊。不知道为什么经常会随机地发生蓝屏。另外,请问针对这种现象我最好应该怎样调试?期待牛人的回答。谢谢。
zeta_jones
驱动牛犊
驱动牛犊
  • 注册日期2010-04-07
  • 最后登录2010-05-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-05-20 13:45
顶,我也遇到类似的情况,用winbug跟踪蓝屏前状态,发现在KDmaTransfer类中的continue函数出现问题,请问这是怎么回事。还有,蓝屏现象也是发生在N次读取数据后
hyyh619
驱动牛犊
驱动牛犊
  • 注册日期2003-03-23
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-08-12 17:01
加入Driver Verifier可以加快重现蓝屏,也可以更好定位,另外那个内存Free的地址太怪异了。正常情况应该没有这种地址才对。
游客

返回顶部