Root > Solving bugs in your code > Bug reports > Call Stack section > How to read call stacks > Working with call stack

Working with call stack

Previous pageReturn to chapter overviewNext page   

This article is a part of working with bug reports.

 

Here is how you can extract call stack information from various formats of call stacks.

 

 

Delphi

TMainForm.Button1Click

:7796d0e9 kernel32.BaseThreadInitThunk+ 0x12

 

Code address. It's a first part of the line in form ':7796d0e9' (starting with ':'). This value is usually missed - unless line represents code without debug information (like system DLLs, for example).
Stack address. Not specified.
Executable module name. If code address is specified, then this is value right after code address - for example ':7796d0e9 kernel32'. If code address is not specified, then this value is omitted.
Code offset. Not specified.
Unit name. First word in line, if code address is not present. For example, 'Forms'. If code address is present, then this value is skipped.
Class name. Follows unit name after '.'. For example, 'Forms.TCustomForm'.
Method or routine name. If code address is present - follows executable module name. For example, ':7796d0e9 kernel32.BaseThreadInitThunk'. Otherwise it follows class name (if present) or unit name (if class name is not present). For example, 'Forms.TCustomForm.Create'.
Line number. Not specified.
Line number offset. Not specified.
Code offset from procedure's start. If code address is specified, then this is last value in form: '+ 0x12'. For example, ':7796d0e9 kernel32.BaseThreadInitThunk+ 0x12'. If code address is not specified, then this value is not present.

 

 

EurekaLog (raw text)

|7FFFFFFE|04|00000000|00615CD8|Project44.exe|00215CD8|Unit1.pas|Unit1|TMainForm|Button1Click|31[20]|

 

Code address. It's a value in 'Address' column.
Stack address. It's a value in 'Stack' column.
Executable module name. It's a value in 'Module' column.
Code offset. It's a value in 'Offset' column. It's offset from module start (i.e. including $1000 offset for code's section).
Unit name. It's a value in 'Unit' column.
Class name. It's a value in 'Class' column.
Method or routine name. It's a value in 'Procedure/method' column.
Line number. It's first number in 'Line' column. For example, '33[3]'.
Line number offset. It's number inside [] in 'Line' column. For example, '33[3]'.
Code offset from procedure's start. Not specified.

 

 

EurekaLog (Viewer)

Code address. It's a value in 'Address' column.
Stack address. It's a value in 'Stack' column.
Executable module name. It's a value in 'Module' column.
Code offset. It's a value in 'Offset' column. It's offset from module start (i.e. including $1000 offset for code's section).
Unit name. It's a value in 'Unit' column.
Class name. It's a value in 'Class' column.
Method or routine name. It's a value in 'Procedure/method' column.
Line number. It's a value in 'Line' column.
Line number offset. It's a value in 'Rel.line' column.
Code offset from procedure's start. Not specified.

 

 

FastMM

4CC5DC [Unit1.pas][Unit1][Unit1.TMainForm.Button1Click][31]

 

Code address. It's a first number in line. For example, '4C0913'.
Stack address. Not specified.
Executable module name. Not specified.
Code offset. Not specified.
Unit name. Unit file name is a first word inside [], follows code address. May be skipped if not available. For example, '4C0913 [Forms]'. Unit name is also a first word inside next [] pair. For example, '4C0913 [Forms][Forms.TCustomForm.AfterConstruction]'.
Class name. Follows unit name after '.'. For example, '4C0913 [Forms][Forms.TCustomForm.AfterConstruction]'.
Method or routine name. Follows class name (if present) or unit name (if class name is not present, but unit name is present). '.'-separated. For example, '4C0913 [Forms][Forms.TCustomForm.AfterConstruction]'. May also follow code address, if unit name is not present. For example, '75B94911 [BaseThreadInitThunk]'.
Line number. Number inside last's []. For example, '4CC5DC [Unit15.pas][Unit15][Unit15.TForm15.FormCreate][43]'.
Line number offset. Not specified.
Code offset from procedure's start. Not specified.

 

 

JCL

(00087ABC){Project1.exe} [00488ABC] Unit1.TMainForm.Button1Click (Line 31, "Unit1.pas" + 0) + $0

 

Code address. It's a first number in []. Usually follows executable module name. For example, '(00087ABC){Project1.exe} [00488ABC]'.
Stack address. Not specified.
Executable module name. It's a first word in {}. Follows code offset, if it's present. Otherwise it's a first value in the line. For example, '(00087ABC){Project1.exe}'.
Code offset. First value in line, if present. It's inside (). For example, '(00087ABC)'. This is offset from start of code section (i.e. it doesn't include $1000 offset).
Unit name. First word in line without any kind brackets. For example, '(00087ABC){Project1.exe} [00488ABC] Unit1'.
Class name. Follows unit name after '.'. For example, '(00055523){Project1.exe} [00456523] Controls.TWinControl'.
Method or routine name. Follows class name (if present) or unit name (if class name is not present, but unit name is present). '.'-separated. For example, '(00087ABC){Project1.exe} [00488ABC] Unit1.A'.
Line number. It's number after "Line" word. For example, '(00087ABC){Project1.exe} [00488ABC] Unit1.A (Line 44)'
Line number offset. Follows line number and unit file name. Has a form of '+  1'. For example, '(00087ABC){Project1.exe} [00488ABC] Unit1.A (Line 44, "Unit1.pas" + 0)'.
Code offset from procedure's start. Follows ()-part with line number information. Has a form of '+ $6C'. For example, '(00087ABC){Project1.exe} [00488ABC] Unit1.A (Line 44, "Unit1.pas" + 0) + $0'.

 

 

madExcept

0086ad33 +001f Project1.exe Unit1 31 +1 TMainForm.Button1Click

 

Code address. It's a first part of the line. For example, '0086ad33'.
Stack address. Not specified.
Executable module name. It a first word in line. It follows code offset. Space-delimited from other parts. For example, '0086ad33 +001f Project1.exe'.
Code offset. Not specified.
Unit name. Second word in line, follows executable module name. For example, '0086ad33 +001f Project1.exe OleCtrls'. May be skipped if not available.
Class name. Follows line number information. Class and method names are last information in the line. For example, '0086ad33 +001f Project1.exe OleCtrls 640 +11 TOleControl.Destroy'.
Method or routine name. Follows class name (if present) or line numbers section (if class name is not present, but unit name is present). For example, '0086ad33 +001f Project1.exe OleCtrls 640 +11 TOleControl.Destroy'.
Line number. Number which follows unit name. For example, '0086ad33 +001f Project1.exe OleCtrls 640 +11'.
Line number offset. It follows line number. Has a form '+16'. For example, '0086ad33 +001f Project1.exe OleCtrls 640 +11'.
Code offset from procedure's start. It follows code address. Has a form '+0009'. For example, '0086ad33 +001f'.

 

Now, when you have all information, it's time to put it in use and try to find bug's location.

 

 

See also:




Send feedback... Build date: 2023-09-11
Last edited: 2023-03-07
PRIVACY STATEMENT
The documentation team uses the feedback submitted to improve the EurekaLog documentation. We do not use your e-mail address for any other purpose. We will remove your e-mail address from our system after the issue you are reporting has been resolved. While we are working to resolve this issue, we may send you an e-mail message to request more information about your feedback. After the issues have been addressed, we may send you an email message to let you know that your feedback has been addressed.


Permanent link to this article: https://www.eurekalog.com/help/eurekalog/working_with_call_stack.php