diff options
Diffstat (limited to 'widget/cocoa/nsCocoaDebugUtils.h')
-rw-r--r-- | widget/cocoa/nsCocoaDebugUtils.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/widget/cocoa/nsCocoaDebugUtils.h b/widget/cocoa/nsCocoaDebugUtils.h new file mode 100644 index 0000000000..814f060878 --- /dev/null +++ b/widget/cocoa/nsCocoaDebugUtils.h @@ -0,0 +1,136 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsCocoaDebugUtils_h_ +#define nsCocoaDebugUtils_h_ + +#include <CoreServices/CoreServices.h> + +// Definitions and declarations of stuff used by us from the CoreSymbolication +// framework. This is an undocumented, private framework available on OS X +// 10.6 and up. It's used by Apple utilities like dtrace, atos, ReportCrash +// and crashreporterd. + +typedef struct _CSTypeRef { + unsigned long type; + void* contents; +} CSTypeRef; + +typedef CSTypeRef CSSymbolicatorRef; +typedef CSTypeRef CSSymbolOwnerRef; +typedef CSTypeRef CSSymbolRef; +typedef CSTypeRef CSSourceInfoRef; + +typedef struct _CSRange { + unsigned long long location; + unsigned long long length; +} CSRange; + +typedef unsigned long long CSArchitecture; + +#define kCSNow LONG_MAX + +extern "C" { + +CSSymbolicatorRef +CSSymbolicatorCreateWithPid(pid_t pid); + +CSSymbolicatorRef +CSSymbolicatorCreateWithPidFlagsAndNotification(pid_t pid, + uint32_t flags, + uint32_t notification); + +CSArchitecture +CSSymbolicatorGetArchitecture(CSSymbolicatorRef symbolicator); + +CSSymbolOwnerRef +CSSymbolicatorGetSymbolOwnerWithAddressAtTime(CSSymbolicatorRef symbolicator, + unsigned long long address, + long time); + +const char* +CSSymbolOwnerGetName(CSSymbolOwnerRef owner); + +unsigned long long +CSSymbolOwnerGetBaseAddress(CSSymbolOwnerRef owner); + +CSSymbolRef +CSSymbolOwnerGetSymbolWithAddress(CSSymbolOwnerRef owner, + unsigned long long address); + +CSSourceInfoRef +CSSymbolOwnerGetSourceInfoWithAddress(CSSymbolOwnerRef owner, + unsigned long long address); + +const char* +CSSymbolGetName(CSSymbolRef symbol); + +CSRange +CSSymbolGetRange(CSSymbolRef symbol); + +const char* +CSSourceInfoGetFilename(CSSourceInfoRef info); + +uint32_t +CSSourceInfoGetLineNumber(CSSourceInfoRef info); + +CSTypeRef +CSRetain(CSTypeRef); + +void +CSRelease(CSTypeRef); + +bool +CSIsNull(CSTypeRef); + +void +CSShow(CSTypeRef); + +const char* +CSArchitectureGetFamilyName(CSArchitecture); + +} // extern "C" + +class nsCocoaDebugUtils +{ +public: + // Like NSLog() but records more information (for example the full path to + // the executable and the "thread name"). Like NSLog(), writes to both + // stdout and the system log. + static void DebugLog(const char* aFormat, ...); + + // Logs a stack trace of the current point of execution, to both stdout and + // the system log. + static void PrintStackTrace(); + + // Returns the name of the module that "owns" aAddress. This must be + // free()ed by the caller. + static char* GetOwnerName(void* aAddress); + + // Returns a symbolicated representation of aAddress. This must be + // free()ed by the caller. + static char* GetAddressString(void* aAddress); + +private: + static void DebugLogInt(bool aDecorate, const char* aFormat, ...); + static void DebugLogV(bool aDecorate, CFStringRef aFormat, va_list aArgs); + + static void PrintAddress(void* aAddress); + + // The values returned by GetOwnerNameInt() and GetAddressStringInt() must + // be free()ed by the caller. + static char* GetOwnerNameInt(void* aAddress, + CSTypeRef aOwner = sInitializer); + static char* GetAddressStringInt(void* aAddress, + CSTypeRef aOwner = sInitializer); + + static CSSymbolicatorRef GetSymbolicatorRef(); + static void ReleaseSymbolicator(); + + static CSTypeRef sInitializer; + static CSSymbolicatorRef sSymbolicator; +}; + +#endif // nsCocoaDebugUtils_h_ |