gflags调试访问越界
2011-9-27
燭秋
?
昨天、今天調(diào)dump,對(duì)windbg相當(dāng)?shù)牟皇煜?#xff0c;但也慢慢的知道了一些常用的命令,幾周前聽(tīng)說(shuō)到有g(shù)flags這樣個(gè)工具,今天正好測(cè)試下。
?
gflags.exe是<Debugging Tools for Windows>中的一個(gè)小工具。
安裝下載鏈接:http://msdn.microsoft.com/en-us/windows/hardware/gg463016
?
安裝好之后,把gflags所在文件夾(這里邊還有很多好東西)設(shè)置到環(huán)境變量的path中,方便命令行使用。(我的電腦-->右鍵-->屬性-->高級(jí)-->環(huán)境變量-->系統(tǒng)變量-->path)
?
在命令行cmd里輸入:cdb -iae 。
設(shè)置cdb為默認(rèn)JIT(just in time) debugger,這樣在命令行執(zhí)行遇到崩潰的時(shí)候就會(huì)停下來(lái)。
?
(本文最后的學(xué)習(xí)資料相當(dāng)好)
?
?
測(cè)試程序:///int main(){char *p = new char[10];for(int i = 0; i != 11; ++i) p[i] = i;return 0;}///?
?這是一個(gè)非常簡(jiǎn)單的越界程序,當(dāng)i = 10時(shí),訪問(wèn)越界了。但是如果不采用測(cè)試工具,這里是不會(huì)發(fā)生崩潰的。一般情況下,程序獲取的空間是16字節(jié)對(duì)齊的,所以p[10]訪問(wèn)到的是對(duì)齊之后增加的空間,不會(huì)導(dǎo)致越界崩潰。但這是隱患,為了使隱患盡早被發(fā)現(xiàn),使用工具是很好的選擇。
gflags用來(lái)跟蹤這個(gè)程序的執(zhí)行,可以設(shè)置每一次new分配的堆空間都單獨(dú)的占有一塊空間,并且這個(gè)空間相鄰的位置被設(shè)置為不可訪問(wèn)的,一旦訪問(wèn)越界立即觸發(fā)訪問(wèn)無(wú)效錯(cuò)誤,盡早的觸發(fā)崩潰。
測(cè)試過(guò)程如下:
1、用vc編譯出release版本的可執(zhí)行文件:test.exe。(注意:不是debug版本)
2、用gflag注冊(cè)需要監(jiān)控的可執(zhí)行文件test.exe。
在cmd下,輸入命令如下:gflags /p /enable test.exe /full /unaligned。
回車,顯示如下信息:
*************************************************************************************
path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
??test.exe: page heap enabled。
*************************************************************************************
這個(gè)時(shí)候,已經(jīng)把要監(jiān)控的test.exe注冊(cè)上了。
?
/p /enable是必備的。
/full說(shuō)明分配的空間是獨(dú)占的,并且相鄰的是不可訪問(wèn)的空間。
/unaligned說(shuō)明分配空間時(shí)不對(duì)齊,保證一旦越界立即發(fā)現(xiàn),不會(huì)因?yàn)閮?nèi)存對(duì)齊而隱藏起來(lái)。
3、接著雙擊執(zhí)行test.exe,這個(gè)時(shí)候,會(huì)中斷下來(lái):
*************************************************************************************
(17f8.5d0): Access violation - code c0000005 (!!! second chance !!!)
eax=0161eff6 ebx=7c80ac61 ecx=0000000a edx=015c5000 esi=00000002 edi=00000a28
eip=00401010 esp=0012ff74 ebp=0012ffc0 iopl=0 ? ? ? ? nv up ei ng nz ac pe cy
cs=001b ?ss=0023 ?ds=0023 ?es=0023 ?fs=003b ?gs=0000 ? ? ? ? ? ? efl=00000297
WindbgTest!main+0x10:
00401010 880c01 ? ? ? ? ?mov ? ? byte ptr [ecx+eax],cl ? ? ?ds:0023:0161f000=??
*************************************************************************************
如果把exe放到windbg里執(zhí)行,用命令:!address,可以發(fā)現(xiàn)eax是可以讀寫的,
eax+ecx是不可訪問(wèn)的:
*************************************************************************************
0:000>?!address eax
?? ?015c0000 : 0161e000 - 00001000
?? ?Type ? ? 00020000 MEM_PRIVATE
?? ?Protect ?00000004 PAGE_READWRITE
?? ?State ? ?00001000 MEM_COMMIT
?? ?Usage ? ?RegionUsagePageHeap
?? ?Handle ? 015c1000
0:000>?!address eax+ecx
?? ?015c0000 : 0161f000 - 000a1000
?? ?Type ? ? 00020000 MEM_PRIVATE
?? ?Protect ?00000001 PAGE_NOACCESS
?? ?State ? ?00001000 MEM_COMMIT
?? ?Usage ? ?RegionUsagePageHeap
?? ?Handle ? 015c1000
*************************************************************************************
4、取消跟蹤:
通過(guò)/p命令可以看到當(dāng)前跟蹤的程序有哪些:
*************************************************************************************
C:\Documents and Settings\cs_wuyg>gflags /p
path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
?? ?player.exe: page heap enabled with flags (full traces )
?? ?program: page heap enabled with flags (full unaligned traces )
?? ?test.exe: page heap enabled with flags (full unaligned traces )
?? ?windbgtest.exe: page heap enabled with flags (full unaligned traces )
*************************************************************************************
通過(guò)/p /disble取消跟蹤:情況如下:
*************************************************************************************
C:\Documents and Settings\cs_wuyg>gflags /p /disable player.exe
path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
?? ?player.exe: page heap disabled
?
C:\Documents and Settings\cs_wuyg>gflags /p
path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
?? ?program: page heap enabled with flags (full unaligned traces )
?? ?test.exe: page heap enabled with flags (full unaligned traces )
?? ?windbgtest.exe: page heap enabled with flags (full unaligned traces )
*************************************************************************************
?? 發(fā)現(xiàn)program是無(wú)法取消的,很奇怪。另外,發(fā)現(xiàn)注冊(cè)表里相應(yīng)的項(xiàng)目在disable之后,仍然存在,只不過(guò)一些鍵值被刪除掉了。
?? 同事跟我說(shuō),不使用gflags的時(shí)候,最好把注冊(cè)表里的項(xiàng)目刪除,gflags對(duì)機(jī)器性能的影響很大。
?? 注冊(cè)表的位置是:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/Image File Execution Options
?
5、注意事項(xiàng)
一、gflags要跟蹤的程序,是把這個(gè)程序的名稱記錄到了注冊(cè)表中,在設(shè)置的時(shí)候不需要可執(zhí)行文件的路徑名,只需要文件名稱。
二、可以使用命令行,也可以使用GUI界面。GUI界面中的前兩個(gè)TAB頁(yè)面是對(duì)所有的可執(zhí)行程序都有效的。第三個(gè)才是設(shè)置想要跟蹤的程序。
三、還有其它更強(qiáng)大的工具。
6、總結(jié)
通過(guò)這個(gè)工具的簡(jiǎn)單使用,就可以很快發(fā)現(xiàn)代碼中有訪問(wèn)越界。
??在大工程下,是否也非常有用,現(xiàn)在還沒(méi)實(shí)踐過(guò)。
使用gflags,并且在VS下調(diào)試,有源代碼更方便。
?
?
?
?
?
?
?
?
?
7、附今天用上的幾個(gè)windbg命令:
1\ !analyze -v
2\ kv ? kf ? ?kb
3\ ~*k
4\ .ecxr
5\ lmvm xxx.exe?? ? ? ??
?
分析dump的時(shí)候,看調(diào)用堆棧是從下往上看的。
調(diào)用堆棧前部分的數(shù)值一部分是參數(shù),一部分是無(wú)用的信息。
設(shè)置好source file path之后,.ecxr命令可以看到當(dāng)前的寄存器信息,還可以看到源代碼。
?
發(fā)現(xiàn)很多的崩潰是由于空指針、野指針導(dǎo)致的。而空指針、野指針是由于多線程導(dǎo)致卸載、裝載重疊導(dǎo)致的。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
學(xué)習(xí)資料:
http://www.cppblog.com/sandy/archive/2007/03/13/19723.html
http://blog.csdn.net/ayw_hehe/article/details/6796333
http://www.cppblog.com/sandy/archive/2008/09/27/62877.html
http://www.cnblogs.com/awpatp/archive/2011/01/01/1923913.html
http://blog.sina.com.cn/s/blog_484f16880100jrwj.html
?
總結(jié)
以上是生活随笔為你收集整理的gflags调试访问越界的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软考(5)--软件工程
- 下一篇: Processing--鼠标响应(1)