2014-03-26
[CaseStudy][WinDbg] Hang
[Scenario]
User 發生了Hang Issue
[開始查案]
根據收到的Dump 通常會發生Hang 應該是resource被佔住 或是deadlock之類的
所以第一步
!locks
Threads: 84e79d48-02<*> 打*代表 這條Thread 佔了這個resource
從上面資訊來看
最下面的Resource
Resource @ 0x84d8ff34 Shared 1 owning threads
卡住了Thread 84e79d48
而Thread 84e79d48 的Resource
Resource @ 0x851d756c Exclusively owned
卡住了Thread 8605f030
Resource @ 0x85d88840 Exclusively owned
Resource @ 0x85d8ae68 Exclusively owned
所以才造成System Hang
讓我們來看看罪魁禍首 Thread 84e79d48到底在幹嘛
這時候來看看Resource吧
對Resource @ 0x84d8ff34位置下dt
dt 0x84d8ff34 _eresource
Why _eresource 我想應該是ntdll的變數吧
總之 我們看第7個變數
+0x018 OwnerEntry : _OWNER_ENTRY
所以一樣對它下dt
dt 0x84d8ff34 _eresource OwnerEntry.
要記得打"." 才能看更多資訊
沒東西
來看看OwnerTable吧
dt 0x84d8e158 _OWNER_ENTRY
看到TableSize = 7 所以後面可能有7個Entry
我們可以先用 ?? sizeof(_OWNER_ENTRY) 看OWNER_ENTRY的size
unsigned int 8
所以我們知道下一個Entry 就要再+8
dt 0x84d8e160 _OWNER_ENTRY
結果還是這條System Thread呀
所以案子到這邊查不下去了
我們僅知道System Thread這個Resource沒有釋放
所以Lock住 其他需要Exclusively owned的Resource 也造成了Hang
User 發生了Hang Issue
[開始查案]
根據收到的Dump 通常會發生Hang 應該是resource被佔住 或是deadlock之類的
所以第一步
!locks
0: kd> !locks **** DUMP OF ALL RESOURCE OBJECTS **** KD: Scanning for held locks... Resource @ Ntfs!NtfsData (0x88b01474) Exclusively owned Threads: 84acd020-01<*> KD: Scanning for held locks.. Resource @ 0x851d756c Exclusively owned Contention Count = 41 NumberOfSharedWaiters = 29 Threads: 84e79d48-02<*> 85c98790-01 863ec940-01 86557030-01 84bc9d48-01 8603aa60-01 84e7b8f0-01 861073b8-01 8639f5b0-01 84e42648-01 84acd020-01 84c1da58-01 84cf3d48-01 84c48030-01 84c54a88-01 84e3f078-01 8602ec58-01 86203d48-01 85ecd660-01 86202640-01 8620f310-01 862bc030-01 862a9d48-01 84e79410-01 86434c78-01 86a5fa60-01 863f82b8-01 8645d998-01 8605f030-01 86a46a08-01 KD: Scanning for held locks.............................................................. Resource @ 0x85d8ae68 Exclusively owned Contention Count = 2 Threads: 8605f030-01<*> KD: Scanning for held locks. Resource @ 0x85d88840 Exclusively owned Contention Count = 1 NumberOfExclusiveWaiters = 1 Threads: 8605f030-01<*> Threads Waiting On Exclusive Access: 860d88d8 KD: Scanning for held locks................................................................................................................................................................................................................................... Resource @ 0x84d8ff34 Shared 1 owning threads Contention Count = 2 NumberOfExclusiveWaiters = 1 Threads: 84acd420-01<*> Threads Waiting On Exclusive Access: 84e79d48 KD: Scanning for held locks.............................. 10293 total locks, 5 locks currently held
Threads: 84e79d48-02<*> 打*代表 這條Thread 佔了這個resource
從上面資訊來看
最下面的Resource
Resource @ 0x84d8ff34 Shared 1 owning threads
卡住了Thread 84e79d48
而Thread 84e79d48 的Resource
Resource @ 0x851d756c Exclusively owned
卡住了Thread 8605f030
Resource @ 0x85d88840 Exclusively owned
Resource @ 0x85d8ae68 Exclusively owned
所以才造成System Hang
讓我們來看看罪魁禍首 Thread 84e79d48到底在幹嘛
0: kd> !thread 84acd420 THREAD 84acd420 Cid 0004.001c Teb: 00000000 Win32Thread: 00000000 WAIT: (WrQueue) UserMode Non-Alertable 82948600 QueueObject Not impersonating DeviceMap 89a088d8 Owning Process 84a41a20 Image: System Attached Process N/A Image: N/A Wait Start TickCount 23593 Ticks: 1024 (0:00:00:15.974) Context Switch Count 1966 IdealProcessor: 0 UserTime 00:00:00.000 KernelTime 00:00:00.483 Win32 Start Address nt!ExpWorkerThread (0x8288999e) Stack Init 8ad0bfd0 Current 8ad0bc10 Base 8ad0c000 Limit 8ad09000 Call 0 Priority 14 BasePriority 13 UnusualBoost 1 ForegroundBoost 0 IoPriority 2 PagePriority 5 ChildEBP RetAddr Args to Child 8ad0bc28 8288a69d 84acd420 8293af08 82937d20 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4]) 8ad0bc60 828894f7 84acd4e0 84acd420 82948600 nt!KiSwapThread+0x266 8ad0bc88 8288a1ed 84acd420 84acd4e0 00000000 nt!KiCommitThreadWait+0x1df 8ad0bcec 82889a83 82948600 00000001 00000000 nt!KeRemoveQueueEx+0x4f8 8ad0bd50 82a15f5e 00000000 a9364519 00000000 nt!ExpWorkerThread+0xe5 8ad0bd90 828bd219 8288999e 00000000 00000000 nt!PspSystemThreadStartup+0x9e 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x19結果看來很正常 看不出什麼東西
這時候來看看Resource吧
對Resource @ 0x84d8ff34位置下dt
dt 0x84d8ff34 _eresource
Why _eresource 我想應該是ntdll的變數吧
總之 我們看第7個變數
+0x018 OwnerEntry : _OWNER_ENTRY
所以一樣對它下dt
dt 0x84d8ff34 _eresource OwnerEntry.
要記得打"." 才能看更多資訊
// // Checking of resource of 0x84d8ff34. // 0: kd> dt 0x84d8ff34 _eresource ntdll!_ERESOURCE +0x000 SystemResourcesList : _LIST_ENTRY [ 0x84d8f884 - 0x84d8fed4 ] +0x008 OwnerTable : 0x84d8e158 _OWNER_ENTRY +0x00c ActiveCount : 0n1 +0x00e Flag : 4 +0x010 SharedWaiters : (null) +0x014 ExclusiveWaiters : 0x84d8f838 _KEVENT +0x018 OwnerEntry : _OWNER_ENTRY +0x020 ActiveEntries : 1 +0x024 ContentionCount : 2 +0x028 NumberOfSharedWaiters : 0 +0x02c NumberOfExclusiveWaiters : 1 +0x030 Address : (null) +0x030 CreatorBackTraceIndex : 0 +0x034 SpinLock : 0 // // no thread exclusively owns this resource. // 0: kd> dt 0x84d8ff34 _eresource OwnerEntry. ntdll!_ERESOURCE +0x018 OwnerEntry : +0x000 OwnerThread : 0 +0x004 IoPriorityBoosted : 0y0 +0x004 OwnerReferenced : 0y0 +0x004 OwnerCount : 0y000000000000000000000000000000 (0) +0x004 TableSize : 0
沒東西
來看看OwnerTable吧
dt 0x84d8e158 _OWNER_ENTRY
看到TableSize = 7 所以後面可能有7個Entry
我們可以先用 ?? sizeof(_OWNER_ENTRY) 看OWNER_ENTRY的size
unsigned int 8
所以我們知道下一個Entry 就要再+8
dt 0x84d8e160 _OWNER_ENTRY
0: kd> dt 0x84d8e158 _OWNER_ENTRY ntdll!_OWNER_ENTRY +0x000 OwnerThread : 0 +0x004 IoPriorityBoosted : 0y1 +0x004 OwnerReferenced : 0y1 +0x004 OwnerCount : 0y000000000000000000000000000001 (0x1) +0x004 TableSize : 7 0: kd> dt 0x84d8e160 _OWNER_ENTRY ntdll!_OWNER_ENTRY +0x000 OwnerThread : 0x84acd420 ---> thread of 0x84acd420 shared owns this resource +0x004 IoPriorityBoosted : 0y0 +0x004 OwnerReferenced : 0y0 +0x004 OwnerCount : 0y000000000000000000000000000001 (0x1) +0x004 TableSize : 4從第二個Entry看到了 OwnerThread 0x84acd420
結果還是這條System Thread呀
所以案子到這邊查不下去了
我們僅知道System Thread這個Resource沒有釋放
所以Lock住 其他需要Exclusively owned的Resource 也造成了Hang
劉栩安的日常生活 - 3M to 6M
劉栩安的日常生活 - 3M to 6M
6個月的安安 身高69公分 體重8.1公斤 頭圍44公分
很開心安安的身高追上來了
來看看這三個月間的紀錄吧 (整理時發現這三個月拍了不少照片呢~)
3M
安安的心情都寫在衣服上了 - 我要抱抱
3M17D
睡夢中的來追我阿
3M19D
啊~ 好睏喔 睡著的安安
很懷念他以前好睡的模式
現在有點睡眠障礙呢
安安穿上從美國買來的Carter's
3M24D
安吸的不是手指 是推理!!!!
是不是半夜偷看神探伽利略XD
3M25D
戴上新帽子 安安的咚吱咚吱 開心的勒~
大概從這時候就會發現安安的頭蠻大的
帽子戴起來都很緊繃~
4M
安安四個月了 開始會嘗試坐起來~
四個月 傳說中的收口水儀式~
4M1D
一家三口第一次外出旅行 長榮很貼心地幫忙準備嬰兒所需用品 at 長榮礁溪鳳凰酒店.
很多人說安安跟媽媽都很甜喔~
請叫我頭好壯壯黃飛鴻~
笑容真的很甜~
抬腳腳運動~
4M16D
第一次翻身囉 其實我們很少讓安安趴著 今晚想說訓練一下 沒想到居然真的翻了
4M19D
今年的除夕團圓飯多了安安喔 雖然他是戰力外
吃完團圓飯之後 安安穿上過年限定的戰袍出征囉~
4M20D
大年初一 每次看我們吃東西嘴巴都一直動的安安第一次嘗嘗米精的味道
想不到一試成主顧
大年初一下午來志清湖散散心 — at 長庚大學志清湖
4M21D
大年初二 親戚們來拜年 安安換上另一套服裝見客囉
大家都說安安可愛極了~
4M22D
大年初三好天氣 是個適合出遊的日子 我們選擇到陽明山賞花 下山順道去美麗華晃晃 at 陽明山
下山去逛美麗華鋼鐵人特展
安安 : 喔喔喔~~~
4M26D
台中新社賞櫻 at 新社區公所
賞櫻不忘聞香
5M5D
例行趴趴練習 目標為前方5公分處長頸鹿 流口水了啦
5M5D
自從餵了南瓜泥之後 安安超愛 吃飯時老是高興地跳來跳去 常常吃得滿嘴都是 副作用:黃色大便又多又臭
5M6D
開始嘗試餵紅蘿蔔泥 好像不太好吃耶~
5M15D
到了亂哺口水的年紀 整天哺來哺去的 口水噴的到處都是
5M19D
應該是要長牙了 今天安安咬我的手時 我開始感覺到被硬硬的東西切斷的錯覺 打開嘴巴一看 兩個白白的牙齒就要冒出頭來囉~
老婆一直說安安哭哭很像郝劭文 有像嗎?
5M20D
正所謂阿公阿婆疼孫 安安立馬就擁有人生第一台車~
我一直要安安的阿公阿婆不要這麼著急
按部就班地長大就好
阿婆常常偷偷違反規則ㄟ~
這部車被我要求收起來了 等安安7個月大之後再開箱
5M26D
去月心同事家作客 恰好月心同事也一起來拜訪
安安是哥哥 相當的主動唷
兩小無猜的互動很可愛呢~
以上是迷糊老爸不負責報導
請大家敬請期待下一期6Mto9M的成長紀錄~
2014-03-22
[CaseStudy][WinDbg] Crash - Break instruction exception
[Scenario]
User 從Agent打開log 立即發生了Crash
[開始查案]
根據收到的Dump
正常我們會從FOLLOWUP_IP來看 預計下一步會執行的點
可以看出就是在00000001`40034e03 Call _imp_WaitForMultipleObjects時出了問題
但是這樣還是看不出什麼端倪
所以先列出所有的thread 看是否有異狀
結果在第22條thread 發現了UnhandledException
很明顯
在做wcscpy_s 時 參數錯誤
來看看定義
這題的答案是
wcscpy_s 時的Src size 比Des大 所以造成Crash
User 從Agent打開log 立即發生了Crash
[開始查案]
根據收到的Dump
0:000> !analyze -v FAULTING_IP: +ff79600 00000000`00000000 ?? ??? EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000000000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 STACK_TEXT: 00000000`0011f9f8 000007fe`fd8b1430 : 00000000`01e975d0 00000000`7752300a 00000000`01e975d0 00000000`01e9d868 : ntdll!NtWaitForMultipleObjects+0xa 00000000`0011fa00 00000000`77511220 : 00000000`0011fb40 00000000`0011fb30 00000000`00000000 00000000`00000000 : KERNELBASE!WaitForMultipleObjectsEx+0xe8 00000000`0011fb00 00000001`40034e09 : 00000000`00000000 7fffffff`fffffffe 00000001`4012d390 00000000`00000000 : kernel32!WaitForMultipleObjects+0xb0 00000000`0011fb90 00000001`4002afc7 : 00000001`40137fc0 00000000`00000000 00000000`00000000 00000000`001c3a00 : XXX!CWindowManagerClient::Run+0xe9 ...(Ignore)只知道原因是Break instruction exception 但是從這個Stack看起來卻沒有幫助 因為這條Stack就是顯示主程式起來之後在等結束
正常我們會從FOLLOWUP_IP來看 預計下一步會執行的點
FOLLOWUP_IP: XXX!CWindowManagerClient::Run+e9 00000001`40034e09 3d81000000 cmp eax,81h 0:000> uf 00000001`40034e09 XXX!CWindowManagerClient::Run+0xd1 [XXX\windowmanagerclient.cpp @ 168]: 168 00000001`40034df1 41b901000000 mov r9d,1 168 00000001`40034df7 4533c0 xor r8d,r8d 168 00000001`40034dfa 488d542468 lea rdx,[rsp+68h] 168 00000001`40034dff 418d4901 lea ecx,[r9+1] 168 00000001`40034e03 ff1537080a00 call qword ptr [XXX!_imp_WaitForMultipleObjects (00000001`400d5640)] 169 00000001`40034e09 3d81000000 cmp eax,81h 169 00000001`40034e0e 7775 ja XXX!CWindowManagerClient::Run+0x165 (00000001`40034e85)
可以看出就是在00000001`40034e03 Call _imp_WaitForMultipleObjects時出了問題
但是這樣還是看不出什麼端倪
所以先列出所有的thread 看是否有異狀
0:000> ~*knb ...(Ignore) ... 22 Id: 6b98.1eb0 Suspend: 0 Teb: 000007ff`fff7c000 Unfrozen # Child-SP RetAddr Call Site 00 00000000`09cb89c8 000007fe`fd8b1430 ntdll!NtWaitForMultipleObjects+0xa 01 00000000`09cb89d0 00000000`77522ce3 KERNELBASE!WaitForMultipleObjectsEx+0xe8 02 00000000`09cb8ad0 00000000`77599105 kernel32!WaitForMultipleObjectsExImplementation+0xb3 03 00000000`09cb8b60 00000000`77599287 kernel32!WerpReportFaultInternal+0x215 04 00000000`09cb8c00 00000000`775992df kernel32!WerpReportFault+0x77 05 00000000`09cb8c30 00000000`775994fc kernel32!BasepReportFault+0x1f 06 00000000`09cb8c60 00000000`60201ad5 kernel32!UnhandledExceptionFilter+0x1fc 07 00000000`09cb8d40 00000000`60203547 XXX!_invalid_parameter+0xc5 [f:\sp\vctools\crt_bld\self_64_amd64\crt\src\invarg.c @ 88] 08 00000000`09cb9300 00000000`6006758b XXX!wcscpy_s+0x97 [f:\sp\vctools\crt_bld\self_64_amd64\crt\src\tcscpy_s.inl @ 30] 09 00000000`09cb9340 00000000`600502d7 XXX!CLogQueryEntry::FillDlpData+0x11bb [XXX\logcl_logquery.cpp @ 3211] 0a 00000000`09cb9510 00000000`60049349 XXX!CLogQueryEntry::OnLogviewVirus+0x17f7 [XXX\logcl_logquery.cpp @ 900]
結果在第22條thread 發現了UnhandledException
很明顯
在做wcscpy_s 時 參數錯誤
來看看定義
errno_t wcscpy_s( wchar_t *strDestination, size_t numberOfElements, const wchar_t *strSource );
這題的答案是
wcscpy_s 時的Src size 比Des大 所以造成Crash
2014-03-17
Compile Error when we build the GoogleTest in VS2012
我嘗試要在VS2012上試試Unit Test
Step 1 :
去googletest 網站download googletest project
https://code.google.com/p/googletest/
目前版號是gtest-1.7.0
Step 2:
解壓縮zip
Step 3 :
用VS2012 開啟專案
.\gtest-1.7.0\msvc\
Step 4 :
Rebuild projects
根據Primer上的說明 欲先玩googletest 必先compile之
To write a test program using Google Test, you need to compile Google Test into a library and link your test with it.
但是正常情況下會compile error
錯誤原因為 :
Error 5 error C2977: 'std::tuple' : too many template arguments d:\coding\gtest-1.7.0\include\gtest\gtest-printers.h
[Root Cause]
http://stackoverflow.com/questions/12558327/google-test-in-visual-studio-2012
[Solution]
打開4個Project的Property
properties -> C\C++ Preprocessor -> Processor Definitions -> <edit...>
Add "_VARIADIC_MAX=10"
Save and Rebuild all projects
Step 1 :
去googletest 網站download googletest project
https://code.google.com/p/googletest/
目前版號是gtest-1.7.0
Step 2:
解壓縮zip
Step 3 :
用VS2012 開啟專案
.\gtest-1.7.0\msvc\
Step 4 :
Rebuild projects
根據Primer上的說明 欲先玩googletest 必先compile之
To write a test program using Google Test, you need to compile Google Test into a library and link your test with it.
但是正常情況下會compile error
錯誤原因為 :
Error 5 error C2977: 'std::tuple' : too many template arguments d:\coding\gtest-1.7.0\include\gtest\gtest-printers.h
[Root Cause]
http://stackoverflow.com/questions/12558327/google-test-in-visual-studio-2012
VC++ 2012 does not (and will never) support variadic templates; consequently, its standard library implementation attempts to fake them using preprocessor-generated overloads and specializations. As this blog post notes, the number of faux variadic template parameters defaults to 5 – the problem is that gtest is trying to instantiate
std::tuple<>
with as many as 10 template arguments.
As the blog post goes on to mention, you can define the
_VARIADIC_MAX
macro project-wide to support up through 10 parameters; you'll probably want to do this by way of your project's preprocessor definitions setting.打開4個Project的Property
properties -> C\C++ Preprocessor -> Processor Definitions -> <edit...>
Add "_VARIADIC_MAX=10"
Save and Rebuild all projects