This article is a part of working with bug reports.
Call stack is a central piece of information in any bug report. Call stack is a sequence of addresses (mostly with textual description), which leads us to place of the problem (exception or memory problem).
Here are examples of call stacks in different forms:
Delphi’s call stack (View/Debug Windows/Call Stack)
Call Stack Information: ------------------------------------------------------------------------ |Address |Module |Unit |Class |Procedure/Method |Line | ------------------------------------------------------------------------ |*Exception Thread: ID=8820; Priority=0; Class=; [Main] | |----------------------------------------------------------------------| |004D316F|Project8.exe|Unit9.pas |TForm9|Button1Click |33[3]| |76BCF6A5|user32.dll | | |GetWindowLongW | | |76BCF6B1|user32.dll | | |GetWindowLongW | | |76BC8ABF|user32.dll | | |NotifyWinEvent | | |76BCF6A5|user32.dll | | |GetWindowLongW | | |76BCF6B1|user32.dll | | |GetWindowLongW | | |77AA8502|ntdll.dll | | |NtFindAtom | | |76BF7B8D|user32.dll | | |GetRawInputDeviceInfoW| | |76BD078F|user32.dll | | |GetPropW | | |76BD0AF5|user32.dll | | |SendMessageW | | |76BB8C6B|user32.dll | | |CallNextHookEx | | |76BD0697|user32.dll | | |CallWindowProcW | | |76BD0681|user32.dll | | |CallWindowProcW | | |76BB8C6B|user32.dll | | |CallNextHookEx | | |76BD078F|user32.dll | | |GetPropW | | |76BBE001|user32.dll | | |GetCapture | | |76BD005B|user32.dll | | |DispatchMessageW | | |76BD0051|user32.dll | | |DispatchMessageW | | |004D499D|Project8.exe|Project8.dpr| | |17[4]| ------------------------------------------------------------------------
EurekaLog’s call stack (raw text)
EurekaLog’s call stack (EurekaLog Viewer)
4CC5B7 [Unit15.pas][Unit15][Unit15.B][35] 4CC5C4 [Unit15.pas][Unit15][Unit15.A][39] 4CC5DC [Unit15.pas][Unit15][Unit15.TForm15.FormCreate][43] 4C0CCB [Forms][Forms.TCustomForm.DoCreate] 4C0913 [Forms][Forms.TCustomForm.AfterConstruction] 4C08E8 [Forms][Forms.TCustomForm.Create] 4CA539 [Forms][Forms.TApplication.CreateForm] 4CD986 [Project14][Project14.Project14][14] 75B94911 [BaseThreadInitThunk] 770FE4B6
FastMM’s call stack
(00087A8C){Project1.exe} [00488A8C] Unit1.B (Line 40, "Unit1.pas" + 1) + $5 (00087ABC){Project1.exe} [00488ABC] Unit1.A (Line 44, "Unit1.pas" + 0) + $0 (00055523){Project1.exe} [00456523] Controls.TWinControl.WndProc + $513 (0003AA8C){Project1.exe} [0043BA8C] StdCtrls.TButtonControl.WndProc + $6C (00055673){Project1.exe} [00456673] Controls.DoControlMsg + $23 (00055523){Project1.exe} [00456523] Controls.TWinControl.WndProc + $513 (00068584){Project1.exe} [00469584] Forms.TCustomForm.WndProc + $594 (00054C3C){Project1.exe} [00455C3C] Controls.TWinControl.MainWndProc + $2C (00025724){Project1.exe} [00426724] Classes.StdWndProc + $14 (0005561F){Project1.exe} [0045661F] Controls.TWinControl.DefaultHandler + $D7 (00055523){Project1.exe} [00456523] Controls.TWinControl.WndProc + $513 (0003AA8C){Project1.exe} [0043BA8C] StdCtrls.TButtonControl.WndProc + $6C (00025724){Project1.exe} [00426724] Classes.StdWndProc + $14
JCL’s call stack
main thread ($7c): 3ecf8ea9 +0000 mshtml.dll 7c90e470 +0010 ntdll.dll KiUserCallbackDispatcher 7e42b1a6 +000a USER32.dll DestroyWindow 0086ad33 +001f Project1.exe OleCtrls 640 +11 TOleControl.Destroy 008715c9 +00a1 Project1.exe DHTMLEdit 5225 +16 TCustomDHTMLEdit.Destroy 00533c11 +008d Project1.exe Controls 7737 +16 TWinControl.Destroy 004ee915 +0039 Project1.exe ComCtrls 5666 +6 TTabSheet.Destroy 00533c11 +008d Project1.exe Controls 7737 +16 TWinControl.Destroy 004edb52 +005e Project1.exe ComCtrls 5144 +5 TCustomTabControl.Destroy 004eef15 +0049 Project1.exe ComCtrls 5889 +3 TPageControl.Destroy 00533c11 +008d Project1.exe Controls 7737 +16 TWinControl.Destroy 00510770 +0028 Project1.exe Forms 2644 +3 TScrollingWinControl.Destroy 005116a9 +00f9 Project1.exe Forms 3246 +33 TCustomForm.Destroy 7c90e485 +0009 ntdll.dll KiUserExceptionDispatcher 7ca2b137 +00b4 SHELL32.dll SHGetFileInfoW
madExcept's call stack
So, as you can see: call stack always contains very similar information, which don’t depend on tool created it (well, there are all different applications in the above examples, so don’t try to compare them).
Now it's time to learn how to read call stacks.
See also:
|