You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1073 lines
38 KiB
1073 lines
38 KiB
/* |
|
File: Debugging.h |
|
|
|
Contains: Macros to handle exceptions and assertions. |
|
|
|
Version: QuickTime 7.3 |
|
|
|
Copyright: (c) 2007 (c) 1989-2001 by Apple Computer, Inc., all rights reserved. |
|
|
|
Bugs?: For bug reports, consult the following page on |
|
the World Wide Web: |
|
|
|
http://developer.apple.com/bugreporter/ |
|
|
|
*/ |
|
#ifndef __DEBUGGING__ |
|
#define __DEBUGGING__ |
|
|
|
#ifndef __MACTYPES__ |
|
#include <MacTypes.h> |
|
#endif |
|
|
|
#ifndef __MIXEDMODE__ |
|
#include <MixedMode.h> |
|
#endif |
|
|
|
#ifndef __MACERRORS__ |
|
#include <MacErrors.h> |
|
#endif |
|
|
|
#include <Events.h> |
|
#ifndef __GESTALT__ |
|
#include <Gestalt.h> |
|
#endif |
|
|
|
|
|
|
|
#if PRAGMA_ONCE |
|
#pragma once |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#if PRAGMA_IMPORT |
|
#pragma import on |
|
#endif |
|
|
|
/* |
|
This file supplies standard debugging routines and macros to Carbon and |
|
Classic Mac OS programs. Other C programs which wish to use the |
|
exception handling and assertion macros should include AssertMacros.h |
|
instead of this file. |
|
|
|
To activate debugger breaks, #define DEBUG to 1 (one) before including this |
|
file. Five further levels of debugging are available, selected by #defining |
|
one of the following conditionals to 1 after DEBUG is defined to 1. |
|
|
|
DEBUG_INTERNAL the default; asserts include file and line number |
|
information |
|
|
|
DEBUG_EXTERNAL used for code which must ship to developers outside |
|
your organization; no file or line number |
|
information is included in asserts |
|
|
|
DEBUG_BREAK_ONLY where an assertion string would normally be sent to |
|
the debugger; call Debugger() instead. |
|
|
|
PRODUCTION used for shipping code; no debugger breaks are |
|
emitted |
|
|
|
PERFORMANCE same as PRODUCTION |
|
|
|
#defining DEBUG to 0 is equivalent to #defining PRODUCTION 1 when |
|
DEBUG is 1. (No code for debugger breaks is emitted in either case.) |
|
|
|
#defining DEBUG to 1 without specifying a level is equivalent to #defining |
|
DEBUG_INTERNAL 1. |
|
|
|
In addition, these macros should also be #defined (they are described in detail below): |
|
kComponentSignatureString |
|
COMPONENT_SIGNATURE |
|
*/ |
|
/* |
|
* Before including this file, #define kComponentSignatureString to a C-string |
|
* containing the name of your client and #define COMPONENT_SIGNATURE to your |
|
* client's unique signature (i.e., your program's registered creator type). |
|
* For example: |
|
* |
|
* #define kComponentSignatureString "SurfWriter" |
|
* #define COMPONENT_SIGNATURE 'WAVE' |
|
* |
|
* If you don't define kComponentSignatureString and COMPONENT_SIGNATURE, the |
|
* default kComponentSignatureString and COMPONENT_SIGNATURE values will be |
|
* used by the DEBUGASSERTMSG macros below. |
|
*/ |
|
|
|
#ifndef kComponentSignatureString |
|
#define kComponentSignatureString "Third Party Client" |
|
#endif |
|
#ifndef COMPONENT_SIGNATURE |
|
#define COMPONENT_SIGNATURE '?*?*' |
|
#endif |
|
#define QuoteExceptionString(x) #x |
|
|
|
|
|
/* |
|
* The DEBUGLEVEL's |
|
*/ |
|
#define DEBUG_LEVEL_PRODUCTION 0 |
|
#define DEBUG_LEVEL_BREAK_ONLY 1 |
|
#define DEBUG_LEVEL_EXTERNAL 3 |
|
#define DEBUG_LEVEL_INTERNAL 4 |
|
#define DEBUGFULL DEBUG_LEVEL_INTERNAL |
|
|
|
/* |
|
* define DEBUGLEVEL |
|
*/ |
|
#if DEBUG |
|
#if PRODUCTION |
|
#define DEBUGLEVEL DEBUG_LEVEL_PRODUCTION |
|
#elif PERFORMANCE |
|
#define DEBUGLEVEL DEBUG_LEVEL_PRODUCTION |
|
#elif DEBUG_BREAK_ONLY |
|
#define DEBUGLEVEL DEBUG_LEVEL_BREAK_ONLY |
|
#elif DEBUG_EXTERNAL |
|
#define DEBUGLEVEL DEBUG_LEVEL_EXTERNAL |
|
#elif DEBUG_INTERNAL |
|
#define DEBUGLEVEL DEBUG_LEVEL_INTERNAL |
|
#else |
|
/* default to DEBUG_LEVEL_INTERNAL */ |
|
#define DEBUGLEVEL DEBUG_LEVEL_INTERNAL |
|
#endif |
|
#endif |
|
#ifndef DEBUGLEVEL |
|
#define DEBUGLEVEL DEBUG_LEVEL_PRODUCTION |
|
#endif |
|
|
|
|
|
|
|
/* |
|
* The options parameter to DebugAssert and DEBUGASSERTMSG is currently reserved (must be zero). |
|
*/ |
|
#define DEBUG_NO_OPTIONS 0 |
|
|
|
/* |
|
* DEBUGASSERTMSG() |
|
* |
|
* Summary: |
|
* All error reporting is routed through this macro, which calls the system |
|
* routine DebugAssert(). If you wish to use your own assertion break |
|
* routine, you can override DEBUGASSERTMSG by defining it before including |
|
* this file. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The unique signature of component causing the assertion. |
|
* |
|
* options: |
|
* reserved. |
|
* |
|
* assertionString: |
|
* A pointer to a string constant containing the assertion. |
|
* This must be a string constant (and not a string variable or |
|
* NULL) because the Proeprocessor concatenates it with other |
|
* string constants |
|
* |
|
* exceptionLabelString: |
|
* A pointer to a string containing the exceptionLabel, or NULL. |
|
* |
|
* errorString: |
|
* A pointer to the error string, or NULL. DEBUGASSERTMSG macros |
|
* must not attempt to concatenate this string with constant |
|
* character strings. |
|
* |
|
* fileName: |
|
* A pointer to the fileName or pathname (generated by the |
|
* preprocessor __FILE__ identifier), or NULL. |
|
* |
|
* lineNumber: |
|
* The line number in the file (generated by the preprocessor |
|
* __LINE__ identifier), or 0 (zero). |
|
* |
|
* value: |
|
* A value associated with the assertion, or NULL. |
|
*/ |
|
|
|
#ifndef DEBUGASSERTMSG |
|
#if DEBUGLEVEL == DEBUG_LEVEL_PRODUCTION |
|
/* no debugger message */ |
|
#define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) |
|
#elif DEBUGLEVEL == DEBUG_LEVEL_BREAK_ONLY |
|
/* call Debugger() if it is available */ |
|
#define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ |
|
Debugger() |
|
#elif DEBUGLEVEL == DEBUG_LEVEL_EXTERNAL |
|
/* exclude fileName and lineNumber */ |
|
#define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ |
|
DebugAssert(componentSignature, options, assertionString, exceptionLabelString, errorString, 0, 0, (void*)value) |
|
#else |
|
/* include all info */ |
|
#define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ |
|
DebugAssert(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, (void*)value) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* Define the three inputs to AssertMacros.h |
|
*/ |
|
|
|
#ifndef DEBUG_ASSERT_COMPONENT_NAME_STRING |
|
#define DEBUG_ASSERT_COMPONENT_NAME_STRING kComponentSignatureString |
|
#endif |
|
#ifndef DEBUG_ASSERT_PRODUCTION_CODE |
|
#define DEBUG_ASSERT_PRODUCTION_CODE (DEBUGLEVEL==0) |
|
#endif |
|
#ifndef DEBUG_ASSERT_MESSAGE |
|
#define DEBUG_ASSERT_MESSAGE(componentNameString, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ |
|
DEBUGASSERTMSG(COMPONENT_SIGNATURE, DEBUG_NO_OPTIONS, componentNameString ": " assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) |
|
#endif |
|
|
|
/* |
|
* Include AssertMacros.h where all of the check, verify, and require macros are defined |
|
*/ |
|
#include <AssertMacros.h> |
|
/* |
|
* The following check, verify, and require macros assert that TaskLevel is 0. |
|
*/ |
|
|
|
#define ATTASKLEVEL0() \ |
|
(TaskLevel() == 0) |
|
|
|
|
|
#define check_tasklevel0() \ |
|
check(ATTASKLEVEL0()) |
|
|
|
|
|
#define check_tasklevel0_string(cstring) \ |
|
check_string(ATTASKLEVEL0(), cstring) |
|
|
|
|
|
#define verify_tasklevel0() \ |
|
verify(ATTASKLEVEL0()) |
|
|
|
|
|
#define verify_tasklevel0_string(cstring) \ |
|
verify_string(ATTASKLEVEL0(), cstring) |
|
|
|
|
|
#define require_tasklevel0(exceptionLabel) \ |
|
require(ATTASKLEVEL0(), exceptionLabel) |
|
|
|
|
|
#define require_tasklevel0_action(exceptionLabel, action) \ |
|
require_action(ATTASKLEVEL0(), exceptionLabel, action) |
|
|
|
|
|
#define require_tasklevel0_quiet(exceptionLabel) \ |
|
require_quiet(ATTASKLEVEL0(), exceptionLabel) |
|
|
|
|
|
#define require_tasklevel0_action_quiet(exceptionLabel, action) \ |
|
require_action_quiet(ATTASKLEVEL0(), exceptionLabel, action) |
|
|
|
|
|
#define require_tasklevel0_string(exceptionLabel, cstring) \ |
|
require_string(ATTASKLEVEL0(), exceptionLabel, cstring) |
|
|
|
|
|
#define require_tasklevel0_action_string(exceptionLabel, action, cstring) \ |
|
require_action_string(ATTASKLEVEL0(), exceptionLabel, action, cstring) |
|
|
|
/* |
|
* SafeDebugger and SafeDebugStr work like Debugger and DebugStr in both |
|
* production and non-preduction builds, but only call the debugger |
|
* if the debugger is installed. |
|
*/ |
|
|
|
#if CALL_NOT_IN_CARBON |
|
/* Make sure a low level debugger is installed on Mac OS 8 or 9 */ |
|
#define SafeDebugger() \ |
|
do \ |
|
{ \ |
|
if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ |
|
(((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ |
|
((*((unsigned long *)0x0120)) != 0) && \ |
|
((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ |
|
{ \ |
|
Debugger(); \ |
|
} \ |
|
} while ( false ) |
|
#else |
|
/* Debugger() is always safe on Carbon under Mac OS X */ |
|
/* Otherwise we must make sure a low level debugger is installed */ |
|
#define SafeDebugger() \ |
|
do \ |
|
{ \ |
|
long response; \ |
|
if ( (Gestalt(gestaltSystemVersion, &response) == noErr) && \ |
|
(response >= 0x1000) ) \ |
|
{ \ |
|
Debugger(); \ |
|
} \ |
|
else \ |
|
{ \ |
|
if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ |
|
(((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ |
|
((*((unsigned long *)0x0120)) != 0) && \ |
|
((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ |
|
{ \ |
|
Debugger(); \ |
|
} \ |
|
} \ |
|
} while ( false ) |
|
#endif |
|
|
|
|
|
#if CALL_NOT_IN_CARBON |
|
/* Make sure low level debugger is installed on Mac OS 8 or 9 */ |
|
#define SafeDebugStr(str) \ |
|
do \ |
|
{ \ |
|
if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ |
|
(((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ |
|
((*((unsigned long *)0x0120)) != 0) && \ |
|
((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ |
|
{ \ |
|
DebugStr(str); \ |
|
} \ |
|
} while ( false ) |
|
#else |
|
/* DebugStr() is always safe on Carbon under Mac OS X */ |
|
/* Otherwise we must make sure a low level debugger is installed */ |
|
#define SafeDebugStr(str) \ |
|
do \ |
|
{ \ |
|
long response; \ |
|
if ( (Gestalt(gestaltSystemVersion, &response) == noErr) && \ |
|
(response >= 0x1000) ) \ |
|
{ \ |
|
DebugStr(str); \ |
|
} \ |
|
else \ |
|
{ \ |
|
if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ |
|
(((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ |
|
((*((unsigned long *)0x0120)) != 0) && \ |
|
((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ |
|
{ \ |
|
DebugStr(str); \ |
|
} \ |
|
} \ |
|
} while ( false ) |
|
#endif |
|
|
|
/* |
|
* DEBUGGER and DEBUGSTR call SafeDebugger and SafeDebugStr only |
|
* in DEBUG builds. |
|
* |
|
* DEBUGGER and DEBUGSTR are defined only if they are not already defined to |
|
* prevent conflicts with developer code. |
|
*/ |
|
|
|
#ifndef DEBUGGER |
|
#if DEBUG |
|
#define DEBUGGER() \ |
|
SafeDebugger() |
|
#else |
|
#define DEBUGGER() |
|
#endif |
|
#endif |
|
|
|
#ifndef DEBUGSTR |
|
#if DEBUG |
|
#define DEBUGSTR(str) \ |
|
SafeDebugStr(str) |
|
#else |
|
#define DEBUGSTR(str) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* CapsLockDebugger and CapsLockDebugStr call SafeDebugger and SafeDebugStr |
|
* only if the Caps Lock key is down. |
|
*/ |
|
|
|
#define CapsLockDebugger() \ |
|
do \ |
|
{ \ |
|
KeyMap theKeys; \ |
|
GetKeys(theKeys); \ |
|
if ( ((theKeys[1] >> 1) & 0x01) != 0 ) \ |
|
{ \ |
|
SafeDebugger(); \ |
|
} \ |
|
} while ( false ) |
|
|
|
|
|
#define CapsLockDebugStr(str) \ |
|
do \ |
|
{ \ |
|
KeyMap theKeys; \ |
|
GetKeys(theKeys); \ |
|
if ( ((theKeys[1] >> 1) & 0x01) != 0 ) \ |
|
{ \ |
|
SafeDebugStr(str); \ |
|
} \ |
|
} while ( false ) |
|
|
|
/* |
|
* ISCAPSLOCKKEYDOWN and ISLOWLEVELDEBUGGERCALLABLE are convenience macros |
|
* which are only defined for non-Carbon builds because they access |
|
* low memory addresses directly. They have been left in this file for |
|
* use by existing non-Carbon code. |
|
* |
|
* ISCAPSLOCKKEYDOWN and ISLOWLEVELDEBUGGERCALLABLE are defined only |
|
* if they are not already defined to prevent conflicts with developer code. |
|
*/ |
|
|
|
#if CALL_NOT_IN_CARBON |
|
#ifndef ISCAPSLOCKKEYDOWN |
|
#define ISCAPSLOCKKEYDOWN() \ |
|
((((UInt16 *)(0x0174))[3] & 0x0002) == 0x0002) |
|
#endif |
|
|
|
#ifndef ISLOWLEVELDEBUGGERCALLABLE |
|
#define ISLOWLEVELDEBUGGERCALLABLE() \ |
|
( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ |
|
(((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ |
|
((*((unsigned long *)0x0120)) != 0) && \ |
|
((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* You can use DPRINTF as a dprintf which goes away in production builds. |
|
* DPRINTF is not supported by Carbon because dprintf |
|
* is not supported by Carbon. |
|
* |
|
* To use it, double-parenthesize the argument - i.e., use: |
|
* |
|
* DPRINTF(("formatString %d", 5 )); |
|
* |
|
* This is sadly necessary because a macro can not have a variable number |
|
* of arguments. |
|
* |
|
* DPRINTF is defined only if it is not already defined to |
|
* prevent conflicts with developer code. |
|
*/ |
|
|
|
#if DEBUG |
|
#define DPRINTF(x) dprintf x |
|
#else |
|
#define DPRINTF(x) { } |
|
#endif |
|
|
|
|
|
/* |
|
* kBlessedBusErrorBait is an address that will never be mapped by |
|
* Mac OS 8 or 9. It is close to the middle of the 64K range from 0x68F10000 |
|
* to 0x68F1FFFF that is unmapped and cannot be accessed without causing an |
|
* exception. Thus, it's a good value to use for filling uninitialized |
|
* pointers, etc. |
|
* |
|
* Mac OS X programs should NOT use kBlessedBusErrorBait and should use |
|
* zero (0) instead, since by default, page 0 is read and write protected |
|
* for user code. |
|
*/ |
|
enum { |
|
kBlessedBusErrorBait = 0x68F168F1 |
|
}; |
|
|
|
/* |
|
* DebugAssert() |
|
* |
|
* Summary: |
|
* DebugAssert is the system routine that the DEBUGASSERTMSG macro |
|
* calls (by default) to display assertion messsages. The output |
|
* from DebugAssert can be redirected by installing a |
|
* DebugAssertOutputHandler with InstallDebugAssertOutputHandler. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The unique signature of component causing the assertion. |
|
* |
|
* options: |
|
* reserved. |
|
* |
|
* assertionString: |
|
* A pointer to a string containing the assertion, or NULL. |
|
* |
|
* exceptionLabelString: |
|
* A pointer to a string containing the exceptionLabel, or NULL. |
|
* |
|
* errorString: |
|
* A pointer to the error string, or NULL. |
|
* |
|
* fileName: |
|
* A pointer to the fileName or pathname (generated by the |
|
* preprocessor __FILE__ identifier), or NULL. |
|
* |
|
* lineNumber: |
|
* The line number in the file (generated by the preprocessor |
|
* __LINE__ identifier), or 0 (zero). |
|
* |
|
* value: |
|
* A value associated with the assertion, or NULL. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( void ) |
|
DebugAssert( |
|
OSType componentSignature, |
|
UInt32 options, |
|
const char * assertionString, |
|
const char * exceptionLabelString, |
|
const char * errorString, |
|
const char * fileName, |
|
long lineNumber, |
|
void * value) TWOWORDINLINE(0x7000, 0xAA7E); |
|
|
|
|
|
/* |
|
* TaskLevel masks |
|
*/ |
|
enum { |
|
k68kInterruptLevelMask = 0x00000007, /* 68K interrupt levels 0 through 7 */ |
|
kInVBLTaskMask = 0x00000010, /* VBLs are executing */ |
|
kInDeferredTaskMask = 0x00000020, /* Deferred tasks are executing */ |
|
kInSecondaryIntHandlerMask = 0x00000040, /* Secondary interrupt handlers are executing */ |
|
kInNestedInterruptMask = 0x00000080 /* The system is handling an interrupt */ |
|
}; |
|
|
|
/* |
|
* TaskLevel() |
|
* |
|
* Summary: |
|
* TaskLevel returns 0 if we're (probably) running at non-interrupt |
|
* time. There's no way to make this perfect, but this is as close |
|
* as we can get. If TaskLevel doesn't return 0, then one of the |
|
* TaskLevel masks can be used to learn more. |
|
* |
|
* Result: |
|
* The current task level. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( UInt32 ) |
|
TaskLevel(void) TWOWORDINLINE(0x7001, 0xAA7E); |
|
|
|
|
|
/* |
|
* Constants used by the DebugComponent functions |
|
*/ |
|
enum { |
|
kComponentDebugOption = 0 /* optionSelectorNum to turn breaks for component On or Off*/ |
|
}; |
|
|
|
enum { |
|
kGetDebugOption = 1, /* get current debug option setting*/ |
|
kSetDebugOption = 2 /* set debug option*/ |
|
}; |
|
|
|
|
|
/* |
|
* DebugComponentCallbackProcPtr |
|
* |
|
* Discussion: |
|
* DebugComponentCallback is the callback into a component that |
|
* registers with DebugLib. It is called to get the debug option |
|
* setting, or to turn a debug option on or off. |
|
* |
|
* Parameters: |
|
* |
|
* optionSelectorNum: |
|
* The component debug option to set. |
|
* |
|
* command: |
|
* The command the DebugComponentCallbackProc must handle: |
|
* kGetDebugOption - get current debug option setting |
|
* kSetDebugOption - set debug option |
|
* |
|
* optionSetting: |
|
* A pointer to a Boolean where the DebugComponentCallbackProc |
|
* must return the option setting: the current setting if command |
|
* is kGetDebugOption; the new debug option if command is |
|
* kSetDebugOption |
|
*/ |
|
typedef CALLBACK_API( void , DebugComponentCallbackProcPtr )(SInt32 optionSelectorNum, UInt32 command, Boolean *optionSetting); |
|
typedef STACK_UPP_TYPE(DebugComponentCallbackProcPtr) DebugComponentCallbackUPP; |
|
/* |
|
* NewDebugComponent() |
|
* |
|
* Summary: |
|
* NewDebugComponent registers a component with DebugLib. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The unique signature of component. |
|
* |
|
* componentName: |
|
* The displayable string naming the component. |
|
* |
|
* componentCallback: |
|
* The callback into component for working with options. |
|
* |
|
* Result: |
|
* An operating system result code: noErr, memFullErr, |
|
* debuggingExecutionContextErr, debuggingDuplicateSignatureErr, or |
|
* debuggingInvalidNameErr. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( OSStatus ) |
|
NewDebugComponent( |
|
OSType componentSignature, |
|
ConstStr255Param componentName, |
|
DebugComponentCallbackUPP componentCallback) TWOWORDINLINE(0x7002, 0xAA7E); |
|
|
|
|
|
/* |
|
* NewDebugOption() |
|
* |
|
* Summary: |
|
* NewDebugOption registers a debug option with DebugLib. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The signature of component to register a debug option for. |
|
* |
|
* optionSelectorNum: |
|
* The selector number of this debug option. |
|
* |
|
* optionName: |
|
* The displayable string naming this debug option. |
|
* |
|
* Result: |
|
* An operating system result code: noErr, memFullErr, |
|
* debuggingExecutionContextErr, debuggingDuplicateOptionErr, |
|
* debuggingInvalidSignatureErr, debuggingInvalidNameErr, or |
|
* debuggingNoCallbackErr. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( OSStatus ) |
|
NewDebugOption( |
|
OSType componentSignature, |
|
SInt32 optionSelectorNum, |
|
ConstStr255Param optionName) TWOWORDINLINE(0x7003, 0xAA7E); |
|
|
|
|
|
/* |
|
* DisposeDebugComponent() |
|
* |
|
* Summary: |
|
* DisposeDebugComponent removes a component registration and all |
|
* related debug options from DebugLib. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The unique signature of a component. |
|
* |
|
* Result: |
|
* An operating system result code: noErr, |
|
* debuggingExecutionContextErr, or debuggingInvalidSignatureErr. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( OSStatus ) |
|
DisposeDebugComponent(OSType componentSignature) TWOWORDINLINE(0x7004, 0xAA7E); |
|
|
|
|
|
/* |
|
* GetDebugComponentInfo() |
|
* |
|
* Summary: |
|
* GetDebugComponentInfo returns a component registered with |
|
* DebugLib. |
|
* |
|
* Parameters: |
|
* |
|
* index: |
|
* The index into the list of registered components (1-based). |
|
* |
|
* componentSignature: |
|
* A pointer to an OSType where the unique signature of a |
|
* component is returned. |
|
* |
|
* componentName: |
|
* A pointer to an Str255 where the displayable string naming a |
|
* component is returned. |
|
* |
|
* Result: |
|
* An operating system result code: noErr or debuggingNoMatchErr. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( OSStatus ) |
|
GetDebugComponentInfo( |
|
UInt32 index, |
|
OSType * componentSignature, |
|
Str255 componentName) TWOWORDINLINE(0x7005, 0xAA7E); |
|
|
|
|
|
/* |
|
* GetDebugOptionInfo() |
|
* |
|
* Summary: |
|
* GetDebugOptionInfo returns a debug option registered with |
|
* DebugLib. |
|
* |
|
* Parameters: |
|
* |
|
* index: |
|
* The index into the list of registered debug options (0-based); |
|
* 0 = kComponentDebugOption. |
|
* |
|
* componentSignature: |
|
* The unique signature of a component. |
|
* |
|
* optionSelectorNum: |
|
* A pointer to an SInt32 where the selector number of this debug |
|
* option is returned. |
|
* |
|
* optionName: |
|
* A pointer to an Str255 where the displayable string naming this |
|
* debug option is returned. |
|
* |
|
* optionSetting: |
|
* A pointer to an Boolean where the current debug option setting |
|
* is returned. |
|
* |
|
* Result: |
|
* An operating system result code: noErr, |
|
* debuggingInvalidSignatureErr, or debuggingNoMatchErr. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( OSStatus ) |
|
GetDebugOptionInfo( |
|
UInt32 index, |
|
OSType componentSignature, |
|
SInt32 * optionSelectorNum, |
|
Str255 optionName, |
|
Boolean * optionSetting) TWOWORDINLINE(0x7006, 0xAA7E); |
|
|
|
|
|
/* |
|
* SetDebugOptionValue() |
|
* |
|
* Summary: |
|
* SetDebugOptionValue sets a debug option registered with DebugLib. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The unique signature of a component. |
|
* |
|
* optionSelectorNum: |
|
* The selector number of this debug option. |
|
* |
|
* newOptionSetting: |
|
* The new debug option setting. |
|
* |
|
* Result: |
|
* An operating system result code: noErr, |
|
* debuggingInvalidSignatureErr, or debuggingInvalidOptionErr. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( OSStatus ) |
|
SetDebugOptionValue( |
|
OSType componentSignature, |
|
SInt32 optionSelectorNum, |
|
Boolean newOptionSetting) TWOWORDINLINE(0x7007, 0xAA7E); |
|
|
|
|
|
|
|
/* |
|
* DebugAssertOutputHandlerProcPtr |
|
* |
|
* Discussion: |
|
* DebugAssertOutputHandler is the callback that registers with |
|
* DebugLib to handle the output from DebugAssert. The |
|
* "componentSignature" through "value" parameters are the raw |
|
* values passed to DebugAssert when an exception occurs. |
|
* |
|
* Parameters: |
|
* |
|
* componentSignature: |
|
* The unique signature of component causing the assertion. |
|
* |
|
* options: |
|
* reserved. |
|
* |
|
* assertionString: |
|
* A pointer to a string containing the assertion, or NULL. |
|
* |
|
* exceptionLabelString: |
|
* A pointer to a string containing the exceptionLabel, or NULL. |
|
* |
|
* errorString: |
|
* A pointer to the error string, or NULL. |
|
* |
|
* fileName: |
|
* A pointer to the fileName or pathname (generated by the |
|
* preprocessor __FILE__ identifier), or NULL. |
|
* |
|
* lineNumber: |
|
* The line number in the file (generated by the preprocessor |
|
* __LINE__ identifier), or 0 (zero). |
|
* |
|
* value: |
|
* A value associated with the assertion, or NULL. |
|
* |
|
* outputMsg: |
|
* The string DebugAssert build which would normally be passed to |
|
* DebugStr if a DebugAssertOutputHandler isn't installed. |
|
*/ |
|
typedef CALLBACK_API( void , DebugAssertOutputHandlerProcPtr )(OSType componentSignature, UInt32 options, const char *assertionString, const char *exceptionLabelString, const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg); |
|
typedef STACK_UPP_TYPE(DebugAssertOutputHandlerProcPtr) DebugAssertOutputHandlerUPP; |
|
/* |
|
* InstallDebugAssertOutputHandler() |
|
* |
|
* Summary: |
|
* InstallDebugAssertOutputHandler installs a |
|
* DebugAssertOutputHandler which DebugAssert calls instead of |
|
* DebugStr. |
|
* |
|
* Parameters: |
|
* |
|
* handler: |
|
* The DebugAssertOutputHandler to install or NULL to switch back |
|
* to the default handler (DebugStr). |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.0 and later |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API( void ) |
|
InstallDebugAssertOutputHandler(DebugAssertOutputHandlerUPP handler) TWOWORDINLINE(0x7008, 0xAA7E); |
|
|
|
|
|
#if CALL_NOT_IN_CARBON |
|
/* |
|
* dprintf() |
|
* |
|
* Summary: |
|
* printf takes a variable argument list and 'prints' that to the |
|
* debugging output handler. Calling dprintf() from anything but C |
|
* or C++ is tricky. |
|
* |
|
* Parameters: |
|
* |
|
* format: |
|
* The format string. |
|
* |
|
* ...: |
|
* The arguments to the format string. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.1 and later |
|
* CarbonLib: not available |
|
* Mac OS X: not available |
|
*/ |
|
EXTERN_API_C( void ) |
|
dprintf(const char * format, ...) SIXWORDINLINE(0x2057, 0x43EF, 0x0004, 0x303C, 0x000A, 0xAA7E); |
|
|
|
|
|
/* |
|
* vdprintf() |
|
* |
|
* Summary: |
|
* vdprintf takes a va_args list and 'prints' that to the debugging |
|
* output handler. |
|
* |
|
* Parameters: |
|
* |
|
* format: |
|
* The format string. |
|
* |
|
* va_args_list: |
|
* The va_args list. |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: in DebugLib 1.1 and later |
|
* CarbonLib: not available |
|
* Mac OS X: not available |
|
*/ |
|
EXTERN_API( void ) |
|
vdprintf( |
|
const char * format, |
|
char * va_args_list) TWOWORDINLINE(0x7009, 0xAA7E); |
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
/* |
|
* NewDebugComponentCallbackUPP() |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: available as macro/inline |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API_C( DebugComponentCallbackUPP ) |
|
NewDebugComponentCallbackUPP(DebugComponentCallbackProcPtr userRoutine); |
|
#if !OPAQUE_UPP_TYPES |
|
enum { uppDebugComponentCallbackProcInfo = 0x00000FC0 }; /* pascal no_return_value Func(4_bytes, 4_bytes, 4_bytes) */ |
|
#ifdef __cplusplus |
|
inline DEFINE_API_C(DebugComponentCallbackUPP) NewDebugComponentCallbackUPP(DebugComponentCallbackProcPtr userRoutine) { return (DebugComponentCallbackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugComponentCallbackProcInfo, GetCurrentArchitecture()); } |
|
#else |
|
#define NewDebugComponentCallbackUPP(userRoutine) (DebugComponentCallbackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugComponentCallbackProcInfo, GetCurrentArchitecture()) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* NewDebugAssertOutputHandlerUPP() |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: available as macro/inline |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API_C( DebugAssertOutputHandlerUPP ) |
|
NewDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerProcPtr userRoutine); |
|
#if !OPAQUE_UPP_TYPES |
|
enum { uppDebugAssertOutputHandlerProcInfo = 0x00FFFFC0 }; /* pascal no_return_value Func(4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes) */ |
|
#ifdef __cplusplus |
|
inline DEFINE_API_C(DebugAssertOutputHandlerUPP) NewDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerProcPtr userRoutine) { return (DebugAssertOutputHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugAssertOutputHandlerProcInfo, GetCurrentArchitecture()); } |
|
#else |
|
#define NewDebugAssertOutputHandlerUPP(userRoutine) (DebugAssertOutputHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugAssertOutputHandlerProcInfo, GetCurrentArchitecture()) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* DisposeDebugComponentCallbackUPP() |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: available as macro/inline |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API_C( void ) |
|
DisposeDebugComponentCallbackUPP(DebugComponentCallbackUPP userUPP); |
|
#if !OPAQUE_UPP_TYPES |
|
#ifdef __cplusplus |
|
inline DEFINE_API_C(void) DisposeDebugComponentCallbackUPP(DebugComponentCallbackUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } |
|
#else |
|
#define DisposeDebugComponentCallbackUPP(userUPP) DisposeRoutineDescriptor(userUPP) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* DisposeDebugAssertOutputHandlerUPP() |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: available as macro/inline |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API_C( void ) |
|
DisposeDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerUPP userUPP); |
|
#if !OPAQUE_UPP_TYPES |
|
#ifdef __cplusplus |
|
inline DEFINE_API_C(void) DisposeDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } |
|
#else |
|
#define DisposeDebugAssertOutputHandlerUPP(userUPP) DisposeRoutineDescriptor(userUPP) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* InvokeDebugComponentCallbackUPP() |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: available as macro/inline |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API_C( void ) |
|
InvokeDebugComponentCallbackUPP( |
|
SInt32 optionSelectorNum, |
|
UInt32 command, |
|
Boolean * optionSetting, |
|
DebugComponentCallbackUPP userUPP); |
|
#if !OPAQUE_UPP_TYPES |
|
#ifdef __cplusplus |
|
inline DEFINE_API_C(void) InvokeDebugComponentCallbackUPP(SInt32 optionSelectorNum, UInt32 command, Boolean * optionSetting, DebugComponentCallbackUPP userUPP) { CALL_THREE_PARAMETER_UPP(userUPP, uppDebugComponentCallbackProcInfo, optionSelectorNum, command, optionSetting); } |
|
#else |
|
#define InvokeDebugComponentCallbackUPP(optionSelectorNum, command, optionSetting, userUPP) CALL_THREE_PARAMETER_UPP((userUPP), uppDebugComponentCallbackProcInfo, (optionSelectorNum), (command), (optionSetting)) |
|
#endif |
|
#endif |
|
|
|
/* |
|
* InvokeDebugAssertOutputHandlerUPP() |
|
* |
|
* Availability: |
|
* Non-Carbon CFM: available as macro/inline |
|
* CarbonLib: in CarbonLib 1.0 and later |
|
* Mac OS X: in version 10.0 and later |
|
*/ |
|
EXTERN_API_C( void ) |
|
InvokeDebugAssertOutputHandlerUPP( |
|
OSType componentSignature, |
|
UInt32 options, |
|
const char * assertionString, |
|
const char * exceptionLabelString, |
|
const char * errorString, |
|
const char * fileName, |
|
long lineNumber, |
|
void * value, |
|
ConstStr255Param outputMsg, |
|
DebugAssertOutputHandlerUPP userUPP); |
|
#if !OPAQUE_UPP_TYPES |
|
#ifdef __cplusplus |
|
inline DEFINE_API_C(void) InvokeDebugAssertOutputHandlerUPP(OSType componentSignature, UInt32 options, const char * assertionString, const char * exceptionLabelString, const char * errorString, const char * fileName, long lineNumber, void * value, ConstStr255Param outputMsg, DebugAssertOutputHandlerUPP userUPP) { CALL_NINE_PARAMETER_UPP(userUPP, uppDebugAssertOutputHandlerProcInfo, componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg); } |
|
#else |
|
#define InvokeDebugAssertOutputHandlerUPP(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg, userUPP) CALL_NINE_PARAMETER_UPP((userUPP), uppDebugAssertOutputHandlerProcInfo, (componentSignature), (options), (assertionString), (exceptionLabelString), (errorString), (fileName), (lineNumber), (value), (outputMsg)) |
|
#endif |
|
#endif |
|
|
|
#if CALL_NOT_IN_CARBON || OLDROUTINENAMES |
|
/* support for pre-Carbon UPP routines: New...Proc and Call...Proc */ |
|
#define NewDebugComponentCallbackProc(userRoutine) NewDebugComponentCallbackUPP(userRoutine) |
|
#define NewDebugAssertOutputHandlerProc(userRoutine) NewDebugAssertOutputHandlerUPP(userRoutine) |
|
#define CallDebugComponentCallbackProc(userRoutine, optionSelectorNum, command, optionSetting) InvokeDebugComponentCallbackUPP(optionSelectorNum, command, optionSetting, userRoutine) |
|
#define CallDebugAssertOutputHandlerProc(userRoutine, componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg) InvokeDebugAssertOutputHandlerUPP(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg, userRoutine) |
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
#ifdef PRAGMA_IMPORT_OFF |
|
#pragma import off |
|
#elif PRAGMA_IMPORT |
|
#pragma import reset |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* __DEBUGGING__ */ |
|
|
|
|