Re: 请教一个PAGE_GUARD的事情

Windows内核调试

请教一个PAGE_GUARD的事情


jlflyfox 2008-10-29, 20:27 下午

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

我最初了解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);
  }

Re: 请教一个PAGE_GUARD的事情


格蠹老雷 2008-10-29, 21:41 下午
很细心才会注意到这个问题,有执着的求知精神才会深入探索。这是个非常好的问题。留两天时间给其他各位朋友来试验和思考,在《软件调试》中就有答案。嵌入式汇编那几句只要换为DWORD aa=*(DWORD*)lpvAddr;也是一样的。

Re: 请教一个PAGE_GUARD的事情


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

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

Re: 请教一个PAGE_GUARD的事情


格蠹老雷 2008-11-01, 00:32 上午

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

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

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

Re: 请教一个PAGE_GUARD的事情


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

Powered by Community Server Powered by CnForums.Net