|
|
|
Information
about error environment divided by parts.
Sections
Xbase++
level callstack
Full callstack of current thread
Xbase++ internals
User Information
Loaded processes
Loaded DLLs
CPU registers
Machine stack analyse
Xbase++
level callstack
This section
describes Xbase++ call stack of all running threads. This callstack
is the same as callstack returned by ProcName/ProcLine functions.
Additionaly, we add complete
descriptions of parameters and detection of actual codeblocks.
Current thread marked with '*'
sign.
Form
in output |
Description |
Thread
<N>[*] (<ID>) |
<N> - number of thread
[*] - current thread marked as "*"
<ID> - internal ID of thread |
<level>: <funcname>(<lineno>) |
Name
of function and line of source code |
block=<codeBlock> |
<codeBlock> -
actual codeblock for this call stack entry |
parameters=<params>
<N>. attr=<attr>
addr=<addr>
type=<inttype> '<type>'
val=<value> |
<params>
- number of parameters
<N> - paramerer number
<attr> -attribute of parameter in hex (internal representation)
<addr> - internal address of parameter
<inttype> - internal type of parameter
<type> - ValType() like type of parameter
<value> - value of parameter |
Sample
Output |
Thread
1* (1672):
---------------------
1: @XPPCOREMANAGER@I@RAISEDBERROR(93)
parameters=4
1. attr=00000001 addr=0081fa40
type=OO 'O' val=XppCoreManager
2. attr=00000001 addr=0081fa28
type=CCc 'C' val='D:\#RESURS\NSI\SPRAV.DBF'
3. attr=00000001 addr=0081fa10
type=CCs 'C' val='sprav'
4. attr=00000001 addr=0081f9f8
type=NNi 'N' val=123
2: DBRAISEERR(376)
parameters=3
1. attr=00000001 addr=0081fbf4
type=AA 'A' val={{|| 2.00}, {|| 4.00}, {|| 8.00}}
2. attr=00000001 addr=0081fbdc
type=CCs 'C' val='.T.'
3. attr=00000001 addr=0081fbc4
type=LL 'L' val=.F.
3: (B)TESBLOCK(78)
block={|a,b,c| dbRaiseErr(a, b, c)}
4: MAIN(42)
Thread 2 (1136):
--------------------
1: MYSHOW(508)
parameters=1
1. attr=00000001 addr=42aae840
type=CCc 'C' val='Hello world!'
|
Full
callstack of current thread
There is
another callstack, very useful to determining actual case and place
of error. Some information not shown in usual Xbase++ callstack which holds
only Xbase++ compatible calls. You can't check if there BEGIN SEQUENCE
or not. And you can't find out how is executed code block, by Eval()
or AScan(), or AEval() etc.
This callstack,
internally, is linked list of recovery points, used to properly handle
errors and BEGIN SEQUENCEs. Most entries from Xbase++ callstack also
represented in this stack. Other elements is internal functions and
BEGIN SEQUENCEs.
Only in this list you can see actual parameters for Eval(), AScan()
and AEval() calls.
Form
in output |
Description |
<level>: <type> <procName> <name>[<shift>]
<modulePath> (<addr>)
|
<type> - type of entry:
x++ - uses Xbase++
type of parameters
core - low level function
SEQ - start
of BEGIN SEQUENCE
<name> -
name of function
<shift> - offset from beginning of function
(not lineno!)
<modulePath> - full name of module of
function (exe or dll)
<addr> - actual address of error point
|
Sample
Output |
1: x++
TESTBB(57) TESTBB[+00000062] C:\CL5\ALTEST\XCrash\TESTDLL.dll (00c53472)
parameters=2
1. attr=00000001 addr=0082e180
type=UU 'U' val=NIL
2. attr=00000001 addr=0082e198
type=NNi 'N' val=3
2: x++ ?exePcodeEval[+000004df] C:\ALASKA\XPPW32\lib\XPPRT1.dll (0089815f)
3: x++ EVAL[+0000047c] C:\ALASKA\XPPW32\lib\XPPRT1.dll (00895265)
parameters=1
1. attr=00000001 addr=0082e3a4
type=BB 'B' val={|a,b,c|
testBB(a, 3)}
4: x++ TESTBLOCKBUG(26) TESTBLOCKBUG[+00000062] C:\CL5\ALTEST\XCrash\TESTDLL.dll
(00c52f72)
parameters=2
1. attr=00000001 addr=0082e580
type=CC 'C' val='09:37:55'
2. attr=00000001 addr=0082e568
type=NNi 'N' val=3
5: SEQ MAIN[+000007dc] C:\CL5\ALTEST\XCrash\INSIDER.EXE (004036ec)
6: x++ MAIN(99) MAIN[+00000062] C:\CL5\ALTEST\XCrash\INSIDER.EXE
(00402f72)
7: core ___iniStart[+0000013c] C:\ALASKA\XPPW32\lib\XPPRT1.dll (0084176e)
8: core ___iniStart[+000000b5] C:\ALASKA\XPPW32\lib\XPPRT1.dll (008416e7)
|
Xbase++
internals
This section
is about alloced memory and variables.
Form
in output |
Description |
momObjects
table:
range=<range>
(<size> bytes)
total=<total> (free=<free>)
|
<range>
- area of memory where variables headers stored
<size> - size of this area
<total> - number of elements of table
<free> - number of free elements |
momHandles
table:
range=<range>
(<size> bytes)
blocks=<blocks> (free=<free>
freeSize=<freesize> bytes)
|
<range>
- area of memory where Xbase++ allocate memory for
variables
<size> - size of this area
<blocks> - number of elements of table
<free> - number of free elements
<freeSize>
- size of free area
|
Variables:
<typenameN> = <countN>
...
|
<typenameN>
- name of variable type
<countN> - count of this variables |
Objects:
<objectnameN> = <countN>
...
|
<objectnameN>
- name of object
<countN> - number of used objects |
Containers:
Type Count
-----------
<typeN> =
<countN>
...
other = <countOther>
locked = <countLocked> |
<typeN> - internal type of variable (first char in most
cases like by ValType() return)
<countN> - number of variables of this
type
other = other elements
locked = number of locked elements |
Sample
Output |
momObjects
table:
range=01b10000-01b4ff00 (261888 bytes)
total=21824 (free=117)
momHandles
table:
range=426d0003-428c6fff (2060284 bytes)
blocks=21628 (free=24 freeSize=261180 bytes)
Variables:
Class = 21
Container = 3265
Array = 3050
Instance = 6016
Codeblock = 3001
Objects:
thread = 1
XbpStdCrt = 1
XbpIWindow = 1
XbpMicroPS = 5
XbpCrt = 1
testClass = 3001
testClass2 = 3002
XbpPresSpace = 1
XbpWindowDC = 1
XppCoreManager = 1
XppHooks = 1
Containers:
UU = 32
NNi = 3038
CC = 50
CCc = 3
LL = 25
BB = 1
AA = 7
OO = 30
CCs = 79
other = 6350
unkn = 4
locked = 104
|
User
Information
Loaded
processes
For some
cases, can be very useful to know list of currently runned software.
Form
in output |
Description |
pId=<pId>
.threads=<threads> <name>
... |
<pId> - process id in hex
<threads>
- number of threads
<name> - name of process |
Sample
Output |
pId=00000000
.threads=1 [System Process]
pId=00000004 .threads=51 System
pId=00000178 .threads=3 SMSS.EXE
...
pId=0000040c .threads=5 INSIDER.EXE
|
Loaded
DLLs
This is
an snapshot of all
loaded dlls into process memory. You can see full path to dll and its
timestamp. It can be very useful to view drivers versions, antiviruses
and so on.
Form
in output |
Description |
<range>
<shift> <name&info>
...
|
<range> - area in memore where dll
is loaded
<shift>
- offset from original load address of dll
<name&info> - full filename of dll and its size,
date and time |
Sample
Output |
00400000-00418fff
-------- INSIDER.EXE C:\ALASKA\ALTEST\XCrash\INSIDER.EXE 93696 11/11/2005
12:29:16
77f50000-77ff8fff -------- ntdll.dll C:\WINDOWS\System32\ntdll.dll
674304 23/8/2001 12:00:00
77e60000-77f44fff -------- kernel32.dll C:\WINDOWS\system32\kernel32.dll
926720 23/8/2001 12:00:00
0c710000-0c95ffff +0c310000 XPPRT1.dll C:\ALASKA\XPPW32\lib\XPPRT1.dll
1673216 1/5/2005 4:23:32
00220000-002effff -001e0000 ASRDBC10.dll C:\ALASKA\XPPW32\lib\ASRDBC10.dll
130560 1/5/2005 4:23:32
002f0000-003bffff -00110000 XppNat.dll C:\ALASKA\XPPW32\lib\XppNat.dll
168960 1/5/2005 4:23:32
...
76f90000-76f9ffff -------- Secur32.dll C:\WINDOWS\System32\Secur32.dll
52224 23/8/2001 12:00:00 |
CPU
registers
Value of
CPU registers at error point.
Sample
Output |
eax=00000000
ebx=00000688
ecx=00000001
edx=00000000
esi=00000000
edi=00000000
|
Machine
stack analyse
©2006
Eleus Software
|