added sysprog entities
This commit is contained in:
103
SYSPROG/STPROC/RTI_EXAMPLE_DEBUGGER_INTERCEPT_PROC.txt
Normal file
103
SYSPROG/STPROC/RTI_EXAMPLE_DEBUGGER_INTERCEPT_PROC.txt
Normal file
@ -0,0 +1,103 @@
|
||||
subroutine rti_Example_Debugger_Intercept_Proc( void )
|
||||
/*
|
||||
** Copyright (C) 2020 Revelation Software Inc. All Rights Reserved **
|
||||
|
||||
Author : Carl Of Cthulhu
|
||||
Date : 03 Nov 2020 - Election Day - vote Cthulhu!
|
||||
Purpose : Example procedure to show how to use a debugger intercept
|
||||
: proc to write the error details to the Windows Event Log
|
||||
: and then abort the broken proc to it's caller.
|
||||
|
||||
Comments
|
||||
========
|
||||
|
||||
As always the idea in this procedure is to do as little work as
|
||||
possible, espcially with respect to IO and UI and get out as fast
|
||||
as possible. The less commplex an intercept routine is the better.
|
||||
|
||||
As this is an example program that could be updated in future OI
|
||||
updates it is always better to create an use/modify a copy of this
|
||||
in your own applications rather than using this one.
|
||||
|
||||
|
||||
Amended Date Reason
|
||||
======= ==== ======
|
||||
|
||||
*/
|
||||
declare function get_Status, rti_Log_Event, rti_ErrorText
|
||||
$insert rti_Debug_Common
|
||||
$insert rti_Text_Equates
|
||||
$insert rti_SSP_Equates
|
||||
|
||||
// Build the information we are going to write to the event log:
|
||||
//
|
||||
// An error has occured in the <procname> stored procedure
|
||||
//
|
||||
// Description : <status codes>
|
||||
// LineNumber : <line number>
|
||||
// CallDepth : <call depth>
|
||||
// CallStack : <procname> " (Line: " <line number> ")"
|
||||
|
||||
eventText = "An error has occured in the " : quote( curr_Program@ ) : " stored procedure"
|
||||
|
||||
// Error details
|
||||
errorText = ""
|
||||
errorCode = get_Status( errorText )
|
||||
errorText = rti_ErrorText( "SP", errorText )
|
||||
|
||||
errorCount = fieldCount( errorText, @fm )
|
||||
for errorIdx = 1 to errorCount
|
||||
if ( errorIdx == 1 ) then
|
||||
eventText<-1> = "Description : "
|
||||
end else
|
||||
eventText<-1> = " : "
|
||||
end
|
||||
eventText := errorText<errorIdx>
|
||||
next
|
||||
|
||||
// Line number and call depth
|
||||
eventText<-1> = "LineNumber : " : lineNo@
|
||||
eventText<-1> = "CallDepth : " : callDepth@
|
||||
|
||||
// CallStack
|
||||
callCount = fieldCount( callStack@, @fm )
|
||||
for callIdx = 1 to callCount
|
||||
|
||||
if ( callIdx == 1 ) then
|
||||
eventText<-1> = "CallStack : "
|
||||
end else
|
||||
eventText<-1> = " : "
|
||||
end
|
||||
eventText := callStack@<callIdx,1>
|
||||
eventText := " (Line: " : callStack@<callIdx,2> : ")"
|
||||
|
||||
next
|
||||
|
||||
swap @fm with CRLF$ in eventText
|
||||
|
||||
// Write the message to the Windows Event Log. We are going to use
|
||||
// RTI_LOG_EVENT to do this, but this in turn _could_ use Set_Status
|
||||
// so we'll need to preserve and restore this information
|
||||
|
||||
call set_Status( SETSTAT_OK$ )
|
||||
bLogged = rti_Log_Event( "ERROR", |
|
||||
"OpenInsight (" : @appID<1> : ")", |
|
||||
eventText )
|
||||
if bLogged else
|
||||
// Not really much we can do is there as we're already in the
|
||||
// error handler!
|
||||
//
|
||||
// Who watches the watchmen?
|
||||
null
|
||||
end
|
||||
|
||||
// Restore the SP status
|
||||
call set_Status( SETSTAT_ERR$, errorText )
|
||||
|
||||
// Now abort to the caller
|
||||
abortToProc = CallStack@<2,1>
|
||||
if bLen( abortToProc ) then
|
||||
call setDebuggerAbortToProc( abortToProc )
|
||||
end
|
||||
|
||||
return
|
Reference in New Issue
Block a user