body { margin:0px; padding:0px; background:#f6f6f6; color:#000000; font-size: small; } #outer-wrapper { font:normal normal 100% 'Trebuchet MS',Trebuchet,Verdana,Sans-Serif; } a { color:#DE7008; } a:hover { color:#9E5205; } a img { border-width: 0; } #content-wrapper { padding-top: 0; padding-right: 1em; padding-bottom: 0; padding-left: 1em; } @media all { div#main { float:right; width:66%; padding-top:30px; padding-right:0; padding-bottom:10px; padding-left:1em; border-left:dotted 1px #e0ad12; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } div#sidebar { margin-top:20px; margin-right:0px; margin-bottom:0px; margin-left:0; padding:0px; text-align:left; float: left; width: 31%; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } } @media handheld { div#main { float:none; width:90%; } div#sidebar { padding-top:30px; padding-right:7%; padding-bottom:10px; padding-left:3%; } } #header { padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; border-bottom:dotted 1px #e0ad12; background:#F5E39e; } h1 a:link { text-decoration:none; color:#F5DEB3 } h1 a:visited { text-decoration:none; color:#F5DEB3 } h1,h2,h3 { margin: 0; } h1 { padding-top:25px; padding-right:0px; padding-bottom:10px; padding-left:5%; color:#F5DEB3; background:#DE7008; font:normal bold 300% Verdana,Sans-Serif; letter-spacing:-2px; } { color:#9E5205; font:normal bold 160% Verdana,Sans-Serif; letter-spacing:-1px; } a, a:visited { color: #9E5205; } { margin-top:10px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:#777777; font: normal bold 105% 'Trebuchet MS',Trebuchet,Verdana,Sans-serif; } h4 { color:#aa0033; } #sidebar h2 { color:#B8A80D; margin:0px; padding:0px; font:normal bold 150% Verdana,Sans-serif; } #sidebar .widget { margin-top:0px; margin-right:0px; margin-bottom:33px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; font-size:95%; } #sidebar ul { list-style-type:none; padding-left: 0; margin-top: 0; } #sidebar li { margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; list-style-type:none; font-size:95%; } .description { padding:0px; margin-top:7px; margin-right:12%; margin-bottom:7px; margin-left:5%; color:#9E5205; background:transparent; font:bold 100% Verdana,Sans-Serif; } .post { margin-top:0px; margin-right:0px; margin-bottom:30px; margin-left:0px; } .post strong { color:#000000; font-weight:bold; } pre,code { color:#999999; } strike { color:#999999; } .post-footer { padding:0px; margin:0px; color:#444444; font-size:80%; } .post-footer a { border:none; color:#968a0a; text-decoration:none; } .post-footer a:hover { text-decoration:underline; } #comments { padding:0px; font-size:110%; font-weight:bold; } .comment-author { margin-top: 10px; } .comment-body { font-size:100%; font-weight:normal; color:black; } .comment-footer { padding-bottom:20px; color:#444444; font-size:80%; font-weight:normal; display:inline; margin-right:10px } .deleted-comment { font-style:italic; color:gray; } .comment-link { margin-left:.6em; } .profile-textblock { clear: both; margin-left: 0; } .profile-img { float: left; margin-top: 0; margin-right: 5px; margin-bottom: 5px; margin-left: 0; border: 2px solid #DE7008; } #sidebar a:link { color:#999999; text-decoration:none; } #sidebar a:active { color:#ff0000; text-decoration:none; } #sidebar a:visited { color:sidebarlinkcolor; text-decoration:none; } #sidebar a:hover { color:#B8A80D; text-decoration:none; } .feed-links { clear: both; line-height: 2.5em; } #blog-pager-newer-link { float: left; } #blog-pager-older-link { float: right; } #blog-pager { text-align: center; } .clear { clear: both; } .widget-content { margin-top: 0.5em; } /** Tweaks for layout editor preview */ body#layout #outer-wrapper { margin-top: 0; } body#layout #main, body#layout #sidebar { margin-top: 10px; padding-top: 0; } -->

Monday, July 14, 2008

Debugging with WinDBG

Debug with WinDBG
WinDBG is a powerful debugging tool for Microsoft Windows.
You can debugging with Visual Studio, but you can’t install a Visual Studio to every target machines.
WinDBG is light and easy to debugging so that it can be find bug easily.

1. Install WinDBG .
Installing a latest Platform SDK on your computer, WinDBG will be installed by default.
But WinDBG can be update latest version.
So on this page, I recommend install latest version
You can download following page.
WinDBG Download :

2. Install Symbol package.
Symbol files has debugging informations. Like a registry status or function address.
We can debugging program that we’ve programmed codes with *.pdb files. Also We need system dll’s *.pdb files for debugging correctly.
Bunch of system dll’s debugging information files are symbol package.
You can download following page.
Symbol File Download :

3. WinDBG Setting.
After install a WinDBG, setting an environment for WinDBG.
On registry editor (regedit.exe), add new registry key “WinDBG” on
HKLM\Software\Microsoft\Windows\CurrentVersion\App Path\

Then change a default value to "WinDBG.exe" Installed directory.

That can make a start WinDBG , entering a “WinDBG” keyword on “Run” without entering a full path.
Next, add(or modify) a environment variable that symbol file path and symbol server.
On Control Panel>>System>>Advanced>>Environment Variables,
Add(or modify) “_NT_SYMBOL_PATH” value to
srv*c:\Symbols*” .
Entering an “WinDBG –I” on “Run…” , WinDBG is became a postmortem debugger.
(You can change postmortem debugger to Visual Studio, check items on Visual Studio>>Tools>>Options>>Debugging>>Just-In-Time tab)
Start Debugging.
Now I’ll show debugging with WinDBG using program that occurring an error.
I’ve create a SDI Application project and added following codes on
CWinDBGTestApp::InitInstance() function.

TCHAR p[5] = {0,};
TCHAR* txt = _T("Memory Overrun");
CopyMemory(p,txt, _tcslen(txt)*sizeof(TCHAR)); //Actually should be
// occurre an error this line.
//Visual C++ 6 does not. So I added following line.
delete txt;

Executing a program, following error box will be shown.

Pressing a “Retry” button , WinDBG will execute.
WinDBG printed loaded modules and registry values.
For more specific results, re-setting a symbol path with following command.
(You do not need to doing this every time.)
.sympath cache… has WinDBG response time to do update new symbol files faster.
After this, re-load symbols with .reload command.

And print stack back traces with “K*” command.
On this page, we can find which line makes an error using “kb” command.

We can notify that there is some problem on 97th line on "WinDBGTest.cpp".

TCHAR p[5] = {0,};
TCHAR* txt = _T("Memory Overrun");
CopyMemory(p,txt, _tcslen(txt)*sizeof(TCHAR)); //This line is also wrong code
delete txt; //97th line

This sample shown an error on “delete txt” line on VC++6. On Visual Studio 2005(or upper) , occure an error on CopyMemory(…) Line. If you want to know more specific information, read a WinDBG manual on ("% WinDBG Installed %\debugger.chm”) or msdn page.

**Referenced data
WinDBG manual.
Debugging Applications for Microsoft .NET and Microsoft Windows
-MS Press-
Advanced Windows Debugging
-Addison Wesley-

No comments: