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

Windows内核调试

帖子发起人: jlflyfox   发起时间: 2008-10-29 20:27 下午   回复: 4

Print Search
帖子排序:    
   2008-10-29, 20:27 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
请教一个PAGE_GUARD的事情
Reply Quote

首先表示歉意的是这个问题也许不是内核调试的问题,但我觉得其它版面也不合适,因此放在这里咨询。

我最初了解PAGE_GUARD是看windows创建线程对线程堆栈进行分配的时候,我google和msdn了下,有个

http://msdn.microsoft.com/en-us/library/aa366549(VS.85).aspx

这个示例中,先用VirtualAlloc分配了一个页面,然后连续两次VirtualLock访问,结果第一次不行,第二次就可以了。

我发现有个奇怪的事情,在VirtualAlloc后,我立即对分配的页面进行读访问,发现在VC调试的情况下不会有问题,但不调试,就会出问题;而且调试的时候后面的第一次VirtualLock有时也不会出问题了,感觉很奇怪

  lpvAddr = VirtualAlloc(NULL, dwPageSize,
                         MEM_RESERVE | MEM_COMMIT,
                         PAGE_READONLY | PAGE_GUARD);

  ...........

 //下面这个代码是我添加的,发现调试情况下不会出问题,而且后面的第一次VirtualLock有时也不会出问题了,感觉很奇怪

      DWORD * MYWORD;
   __asm { mov eax, lpvAddr }
 __asm { mov MYWORD, eax}
  printf("test1\n");
  DWORD aa = MYWORD[0];
  // Try to lock the committed memory. This fails the first time
  // because of the guard page.

  bLocked = VirtualLock(lpvAddr, dwPageSize);
  if (!bLocked) {
    fprintf(stderr, "Cannot lock at %lp, error = 0x%lx\n",
            lpvAddr, GetLastError());
  } else {
    fprintf(stderr, "Lock Achieved at %lp\n", lpvAddr);
  }
 

bLocked = VirtualLock(lpvAddr, dwPageSize);

  if (!bLocked) {
    fprintf(stderr, "Cannot get 2nd lock at %lp, error = %lx\n",
            lpvAddr, GetLastError());
  } else {
    fprintf(stderr, "2nd Lock Achieved at %lp\n", lpvAddr);
  }


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

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请教一个PAGE_GUARD的事情
Reply Quote
很细心才会注意到这个问题,有执着的求知精神才会深入探索。这是个非常好的问题。留两天时间给其他各位朋友来试验和思考,在《软件调试》中就有答案。嵌入式汇编那几句只要换为DWORD aa=*(DWORD*)lpvAddr;也是一样的。
IP 地址: 已记录   报告
   2008-10-29, 23:00 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: 请教一个PAGE_GUARD的事情
Reply Quote
谢谢回答,我也买了你写的软件调试那本书,不过我还没看,老出差,而且项目主要是JAVA方面,这次这个问题就是我研究JAVA线程的问题,用windows核心编程的vmmap去看线程堆栈发现的,它那个发现线程堆栈应该说并不科学哈。
说来也巧合,当时我买你的书就是与JAVA有关。我研究JVM,想写一个windows下JAVA crash时没有dmp文件(就是drwtson没办法捕获java crash),打算自己在jvm里面做一个内存dmp的代码,才google到你这个网站和这本书,打算好好看,结果没有时间--其实也不是没有时间,是自己太爱玩游戏了。

还记得那天,我去买这本书,正好同时买了一本高级编译原理的书--鲸书,我当时感觉这两本书非常好,虽然角度不一样,但感觉都很爽,可惜我到现在都还没入门,惭愧!
说了那么多啰嗦话,真是不好意思!


IP 地址: 已记录   报告
   2008-11-01, 00:32 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请教一个PAGE_GUARD的事情
Reply Quote

jlflyfox, 因为解释比较长,所以写了篇博客:

http://advdbg.org/blogs/advdbg_system/articles/1354.aspx

如果还有疑问,那么请直言。使用WinDBG调试JVM也是我要做的一件事,很期待你能把你的想法、经历和收获拿出来讨论。


IP 地址: 已记录   报告
   2008-11-01, 11:41 上午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: 请教一个PAGE_GUARD的事情
Reply Quote
谢谢Raymond,你太牛了,我受益匪浅!
调试器能否在获取某个页的信息后,再重新设置这个页面的所属属性啊,虽然可能浪费,但似乎能避免这些事情。
我现在还在局方出差,大约11月中旬回大陆,最近有空闲的时候,我一直在想些问题,到时候认真整理下我对于调试以及调试JVM的一些想法,很想向你好好学习。


IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: 请教一个PAGE_GUARD的事情

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