Merge branch '1.2-with-master' into prepre-for-merge
# Conflicts: # CrashReporter.xcodeproj/project.pbxproj # Source/PLCrashLogWriterTests.m # Source/PLCrashReportSystemInfo.h # Source/PLCrashReportTests.m # Source/PLCrashReporter.h
This commit is contained in:
Коммит
a409cb2c77
|
@ -2618,8 +2618,11 @@
|
|||
034768DFFF38A50411DB9C8B /* Products */,
|
||||
059670E30EEFADA6008A0601 /* Dependencies */,
|
||||
);
|
||||
indentWidth = 4;
|
||||
name = CrashReporter;
|
||||
sourceTree = "<group>";
|
||||
tabWidth = 4;
|
||||
usesTabs = 0;
|
||||
};
|
||||
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
|
@ -5698,12 +5701,16 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CURRENT_PROJECT_VERSION = "1.5.0-beta1";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_ENABLE_CPP_EXCEPTIONS = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREFIX_HEADER = "$(SRCROOT)/Source/PLCrashNamespace.h";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = PLCR_PRIVATE;
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_SHADOW = YES;
|
||||
HEADER_SEARCH_PATHS = "\"$(SRCROOT)/Dependencies/protobuf-c\"";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
|
@ -5724,10 +5731,18 @@
|
|||
PL_IOS_DEPLOYMENT_TARGET = 6.0;
|
||||
PL_MIN_MACOSX_SDK = 1080;
|
||||
PL_PRE_XCODE_10_1_ARCHS = "armv7 armv7s arm64";
|
||||
PL_NEVER_WARN = "-Wno-objc-interface-ivars -Wno-c++98-compat-pedantic -Wno-padded -Wno-gnu-zero-variadic-macro-arguments -Wno-variadic-macros";
|
||||
SDKROOT = macosx;
|
||||
VALID_ARCHS = "i386 ppc armv7 armv7s armv6 x86_64 arm64";
|
||||
WARNING_CFLAGS = (
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
"-Wno-shorten-64-to-32",
|
||||
"-Wimport-preprocessor-directive-pedantic",
|
||||
"-Wimplicit-fallthrough",
|
||||
"-Wreceiver-forward-class",
|
||||
"-Wshift-sign-overflow",
|
||||
"$(PL_NEVER_WARN)",
|
||||
);
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -5737,6 +5752,8 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CURRENT_PROJECT_VERSION = "1.5.0-beta1";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_ENABLE_CPP_EXCEPTIONS = NO;
|
||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||
|
@ -5745,6 +5762,8 @@
|
|||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
HEADER_SEARCH_PATHS = "\"$(SRCROOT)/Dependencies/protobuf-c\"";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_SHADOW = YES;
|
||||
OTHER_CFLAGS = (
|
||||
"$(inherited)",
|
||||
"-D$(PL_BUILD_CONFIG_FLAG)=1",
|
||||
|
@ -5762,10 +5781,18 @@
|
|||
PL_IOS_DEPLOYMENT_TARGET = 6.0;
|
||||
PL_MIN_MACOSX_SDK = 1080;
|
||||
PL_PRE_XCODE_10_1_ARCHS = "armv7 armv7s arm64";
|
||||
PL_NEVER_WARN = "-Wno-objc-interface-ivars -Wno-c++98-compat-pedantic -Wno-padded -Wno-gnu-zero-variadic-macro-arguments -Wno-variadic-macros";
|
||||
SDKROOT = macosx;
|
||||
VALID_ARCHS = "i386 ppc armv7 armv7s armv6 x86_64 arm64";
|
||||
WARNING_CFLAGS = (
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
"-Wno-shorten-64-to-32",
|
||||
"-Wimport-preprocessor-directive-pedantic",
|
||||
"-Wimplicit-fallthrough",
|
||||
"-Wreceiver-forward-class",
|
||||
"-Wshift-sign-overflow",
|
||||
"$(PL_NEVER_WARN)",
|
||||
);
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
@ -48,14 +48,14 @@
|
|||
#endif /* TARGET_OS_IPHONE */
|
||||
|
||||
/* A custom post-crash callback */
|
||||
void post_crash_callback (siginfo_t *info, ucontext_t *uap, void *context) {
|
||||
static void post_crash_callback (siginfo_t *info, ucontext_t *uap, void *context) {
|
||||
// this is not async-safe, but this is a test implementation
|
||||
|
||||
NSLog(@"post crash callback: signo=%d, uap=%p, context=%p", info->si_signo, uap, context);
|
||||
}
|
||||
|
||||
|
||||
void stackFrame (void) {
|
||||
__attribute__((noinline)) static void stackFrame (void) {
|
||||
/* Trigger a crash */
|
||||
((char *)NULL)[1] = 0;
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ static void save_crash_report (PLCrashReporter *reporter) {
|
|||
}
|
||||
|
||||
|
||||
NSData *data = [[PLCrashReporter sharedReporter] loadPendingCrashReportDataAndReturnError: &error];
|
||||
NSData *data = [reporter loadPendingCrashReportDataAndReturnError: &error];
|
||||
if (data == nil) {
|
||||
NSLog(@"Failed to load crash report data: %@", error);
|
||||
return;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
|
||||
|
||||
#include "unwind_test_harness.h"
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
@ -60,7 +61,7 @@ extern void *unwind_tester_list_arm64_frameless[];
|
|||
extern int unwind_tester (void *test, void **sp);
|
||||
extern void *unwind_tester_target_ip;
|
||||
|
||||
void uwind_to_main ();
|
||||
void uwind_to_main (void);
|
||||
|
||||
plframe_cursor_frame_reader_t *frame_readers_frame[] = {
|
||||
plframe_cursor_read_frame_ptr,
|
||||
|
@ -227,7 +228,7 @@ bool unwind_test_harness (void) {
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
plcrash_error_t unwind_current_state (plcrash_async_thread_state_t *state, void *context) {
|
||||
static plcrash_error_t unwind_current_state (plcrash_async_thread_state_t *state, void *context) {
|
||||
plframe_cursor_t cursor;
|
||||
plcrash_async_image_list_t image_list;
|
||||
plframe_cursor_frame_reader_t **readers = global_harness_state.test_case->frame_readers_dwarf;
|
||||
|
@ -320,7 +321,7 @@ plcrash_error_t unwind_current_state (plcrash_async_thread_state_t *state, void
|
|||
// called by test function
|
||||
// we unwind through the test function
|
||||
// and resume at caller (unwind_tester)
|
||||
void uwind_to_main () {
|
||||
void uwind_to_main (void) {
|
||||
/* Invoke our handler with our current thread state; we use this state to try to roll back the tests
|
||||
* and verify that the expected registers are restored. */
|
||||
if (plcrash_async_thread_state_current(unwind_current_state, NULL) != PLCRASH_ESUCCESS) {
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
#ifndef PLCRASH_UNWIND_TEST_HARNESS_H
|
||||
#define PLCRASH_UNWIND_TEST_HARNESS_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
|
@ -26,12 +26,12 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLCrashAsync.h"
|
||||
#include "PLCrashAsync.h"
|
||||
|
||||
#import <stdint.h>
|
||||
#import <errno.h>
|
||||
#import <string.h>
|
||||
#import <inttypes.h>
|
||||
#include <stdint.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
/**
|
||||
* @internal
|
||||
|
@ -144,31 +144,6 @@ const char *plcrash_async_strerror (plcrash_error_t error) {
|
|||
return "Unhandled error code";
|
||||
}
|
||||
|
||||
/**
|
||||
* (Safely) read len bytes from @a source, storing in @a dest.
|
||||
*
|
||||
* @param task The task from which data from address @a source will be read.
|
||||
* @param source The address within @a task from which the data will be read.
|
||||
* @param dest The destination address to which copied data will be written.
|
||||
* @param len The number of bytes to be read.
|
||||
*
|
||||
* @return On success, returns KERN_SUCCESS. If the pages containing @a source + len are unmapped, KERN_INVALID_ADDRESS
|
||||
* will be returned. If the pages can not be read due to access restrictions, KERN_PROTECTION_FAILURE will be returned.
|
||||
*
|
||||
* @warning Unlike all other plcrash_* functions, plcrash_async_read_addr returns a kern_return_t value.
|
||||
* @deprecated New code should make use of plcrash_async_task_memcpy().
|
||||
*/
|
||||
kern_return_t plcrash_async_read_addr (mach_port_t task, pl_vm_address_t source, void *dest, pl_vm_size_t len) {
|
||||
#ifdef PL_HAVE_MACH_VM
|
||||
pl_vm_size_t read_size = len;
|
||||
return mach_vm_read_overwrite(task, source, len, (pointer_t) dest, &read_size);
|
||||
#else
|
||||
vm_size_t read_size = len;
|
||||
return vm_read_overwrite(task, source, len, (pointer_t) dest, &read_size);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Safely add @a offset to @a base_address, returning the result in @a result. If an overflow would occur, false is returned.
|
||||
*
|
||||
|
@ -242,16 +217,13 @@ plcrash_error_t plcrash_async_task_memcpy (mach_port_t task, pl_vm_address_t add
|
|||
|
||||
case KERN_INVALID_ADDRESS:
|
||||
return PLCRASH_ENOTFOUND;
|
||||
break;
|
||||
|
||||
case KERN_PROTECTION_FAILURE:
|
||||
return PLCRASH_EACCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
PLCF_DEBUG("Unexpected error from vm_read_overwrite: %d", kt);
|
||||
return PLCRASH_EUNKNOWN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -407,7 +379,7 @@ void *plcrash_async_memcpy (void *dest, const void *source, size_t n) {
|
|||
* though in reality, it is.
|
||||
*
|
||||
* @param dest Destination.
|
||||
* @param int Value to write to @a dest.
|
||||
* @param value Value to write to @a dest.
|
||||
* @param n Number of bytes to copy.
|
||||
*/
|
||||
void *plcrash_async_memset(void *dest, uint8_t value, size_t n) {
|
||||
|
@ -433,12 +405,12 @@ void *plcrash_async_memset(void *dest, uint8_t value, size_t n) {
|
|||
* should be necessary
|
||||
*/
|
||||
ssize_t plcrash_async_writen (int fd, const void *data, size_t len) {
|
||||
const void *p;
|
||||
const uint8_t *p;
|
||||
size_t left;
|
||||
ssize_t written = 0;
|
||||
|
||||
/* Loop until all bytes are written */
|
||||
p = data;
|
||||
p = (const uint8_t *) data;
|
||||
left = len;
|
||||
while (left > 0) {
|
||||
if ((written = write(fd, p, left)) <= 0) {
|
||||
|
|
|
@ -196,8 +196,6 @@ typedef enum {
|
|||
|
||||
const char *plcrash_async_strerror (plcrash_error_t error);
|
||||
|
||||
kern_return_t plcrash_async_read_addr (mach_port_t task, pl_vm_address_t source, void *dest, pl_vm_size_t len);
|
||||
|
||||
bool plcrash_async_address_apply_offset (pl_vm_address_t base_address, pl_vm_off_t offset, pl_vm_address_t *result);
|
||||
|
||||
thread_t pl_mach_thread_self (void);
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
* @param reader The reader instance to initialize.
|
||||
* @param mobj The memory object containing CFE data at the start address. This instance must survive for the lifetime
|
||||
* of the reader.
|
||||
* @param cpu_type The target architecture of the CFE data, encoded as a Mach-O CPU type. Interpreting CFE data is
|
||||
* @param cputype The target architecture of the CFE data, encoded as a Mach-O CPU type. Interpreting CFE data is
|
||||
* architecture-specific, and Apple has not defined encodings for all supported architectures.
|
||||
*/
|
||||
plcrash_error_t plcrash_async_cfe_reader_init (plcrash_async_cfe_reader_t *reader, plcrash_async_mobject_t *mobj, cpu_type_t cputype) {
|
||||
|
|
|
@ -342,11 +342,11 @@ bool dwarf_cfa_state_iterator<machine_ptr, machine_ptr_s>::next (dwarf_cfa_state
|
|||
}
|
||||
|
||||
/* Provide explicit 32/64-bit instantiations */
|
||||
template class dwarf_cfa_state<uint32_t, int32_t>;
|
||||
template class dwarf_cfa_state_iterator<uint32_t, int32_t>;
|
||||
template class plcrash::async::dwarf_cfa_state<uint32_t, int32_t>;
|
||||
template class plcrash::async::dwarf_cfa_state_iterator<uint32_t, int32_t>;
|
||||
|
||||
template class dwarf_cfa_state<uint64_t, int64_t>;
|
||||
template class dwarf_cfa_state_iterator<uint64_t, int64_t>;
|
||||
template class plcrash::async::dwarf_cfa_state<uint64_t, int64_t>;
|
||||
template class plcrash::async::dwarf_cfa_state_iterator<uint64_t, int64_t>;
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
|
|
@ -290,15 +290,15 @@ plcrash_error_t dwarf_cfa_state<machine_ptr, machine_ptr_s>::eval_program (plcra
|
|||
}
|
||||
|
||||
case DW_CFA_def_cfa_expression: {
|
||||
/* Fetch the DWARF_FORM_block length header; we need this to skip the over the DWARF expression. */
|
||||
uint64_t length = dw_expr_read_uleb128();
|
||||
/* Fetch the DW_FORM_block length header; we need this to skip the over the DWARF expression. */
|
||||
uint64_t blockLength = dw_expr_read_uleb128();
|
||||
|
||||
/* Fetch the opstream position of the DWARF expression */
|
||||
uintptr_t pos = opstream.get_position();
|
||||
|
||||
/* The returned sizes should always fit within the VM types in valid DWARF data; if they don't, how
|
||||
* are we debugging the target? */
|
||||
if (length > PL_VM_SIZE_MAX || length > PL_VM_OFF_MAX) {
|
||||
if (blockLength > PL_VM_SIZE_MAX || blockLength > PL_VM_OFF_MAX) {
|
||||
PLCF_DEBUG("DWARF expression length exceeds PL_VM_SIZE_MAX/PL_VM_OFF_MAX in DW_CFA_def_cfa_expression operand");
|
||||
return PLCRASH_ENOTSUP;
|
||||
}
|
||||
|
@ -324,10 +324,10 @@ plcrash_error_t dwarf_cfa_state<machine_ptr, machine_ptr_s>::eval_program (plcra
|
|||
}
|
||||
|
||||
/* Save the position */
|
||||
set_cfa_expression(abs_addr, length);
|
||||
set_cfa_expression(abs_addr, blockLength);
|
||||
|
||||
/* Skip the expression opcodes */
|
||||
opstream.skip(length);
|
||||
opstream.skip(blockLength);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -368,8 +368,8 @@ plcrash_error_t dwarf_cfa_state<machine_ptr, machine_ptr_s>::eval_program (plcra
|
|||
dwarf_cfa_state_regnum_t regnum = dw_expr_read_uleb128_regnum();
|
||||
uintptr_t pos = opstream.get_position();
|
||||
|
||||
/* Fetch the DWARF_FORM_block length header; we need this to skip the over the DWARF expression. */
|
||||
uint64_t length = dw_expr_read_uleb128();
|
||||
/* Fetch the DW_FORM_BLOCK length header; we need this to skip the over the DWARF expression. */
|
||||
uint64_t blockLength = dw_expr_read_uleb128();
|
||||
|
||||
/* Calculate the absolute address of the expression opcodes (including verifying that pos won't overflow when applying the offset). */
|
||||
#pragma clang diagnostic push
|
||||
|
@ -396,7 +396,7 @@ plcrash_error_t dwarf_cfa_state<machine_ptr, machine_ptr_s>::eval_program (plcra
|
|||
}
|
||||
|
||||
/* Skip the expression opcodes */
|
||||
opstream.skip(length);
|
||||
opstream.skip(blockLength);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -705,7 +705,7 @@ static plcrash_error_t plcrash_async_dwarf_cfa_state_apply_register (task_t task
|
|||
|
||||
regval = rvalue.v64;
|
||||
} else {
|
||||
uint32_t initial_state[] = { cfa_val };
|
||||
uint32_t initial_state[] = { static_cast<uint32_t>(cfa_val) };
|
||||
if ((err = plcrash_async_dwarf_expression_eval<uint32_t, int32_t>(&mobj, task, thread_state, byteorder, expr_addr, 0, expr_len, initial_state, 1, &rvalue.v32)) != PLCRASH_ESUCCESS) {
|
||||
plcrash_async_mobject_free(&mobj);
|
||||
PLCF_DEBUG("CFA eval_32 failed");
|
||||
|
@ -756,8 +756,8 @@ static plcrash_error_t plcrash_async_dwarf_cfa_state_apply_register (task_t task
|
|||
}
|
||||
|
||||
/* Provide explicit 32/64-bit instantiations */
|
||||
template class dwarf_cfa_state<uint32_t, int32_t>;
|
||||
template class dwarf_cfa_state<uint64_t, int64_t>;
|
||||
template class plcrash::async::dwarf_cfa_state<uint32_t, int32_t>;
|
||||
template class plcrash::async::dwarf_cfa_state<uint64_t, int64_t>;
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
|
|
@ -50,8 +50,8 @@ using namespace plcrash::async;
|
|||
*
|
||||
* @param info The CIE info instance to initialize.
|
||||
* @param mobj The memory object containing frame data (eh_frame or debug_frame) at the start address.
|
||||
* @param byteoder The byte order of the data referenced by @a mobj.
|
||||
* @param ptr_state The pointer state to be used when decoding GNU eh_frame pointer values.
|
||||
* @param byteorder The byte order of the data referenced by @a mobj.
|
||||
* @param ptr_reader The pointer reader to be used when decoding GNU eh_frame pointer values.
|
||||
* @param address The task-relative address within @a mobj of the CIE to be decoded.
|
||||
*/
|
||||
template <typename machine_ptr>
|
||||
|
@ -411,18 +411,18 @@ void plcrash::async::plcrash_async_dwarf_cie_info_free (plcrash_async_dwarf_cie_
|
|||
|
||||
/* Provide explicit 32/64-bit instantiations */
|
||||
template
|
||||
plcrash_error_t plcrash_async_dwarf_cie_info_init<uint32_t> (plcrash_async_dwarf_cie_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
gnu_ehptr_reader<uint32_t> *ptr_reader,
|
||||
pl_vm_address_t address);
|
||||
plcrash_error_t plcrash::async::plcrash_async_dwarf_cie_info_init<uint32_t> (plcrash_async_dwarf_cie_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
gnu_ehptr_reader<uint32_t> *ptr_reader,
|
||||
pl_vm_address_t address);
|
||||
|
||||
template
|
||||
plcrash_error_t plcrash_async_dwarf_cie_info_init<uint64_t> (plcrash_async_dwarf_cie_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
gnu_ehptr_reader<uint64_t> *ptr_reader,
|
||||
pl_vm_address_t address);
|
||||
plcrash_error_t plcrash::async::plcrash_async_dwarf_cie_info_init<uint64_t> (plcrash_async_dwarf_cie_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
gnu_ehptr_reader<uint64_t> *ptr_reader,
|
||||
pl_vm_address_t address);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
|
|
@ -52,9 +52,6 @@ namespace async {
|
|||
* @internal
|
||||
*
|
||||
* A DWARF frame reader. Performs DWARF eh_frame/debug_frame parsing from a backing memory object.
|
||||
*
|
||||
* @tparam machine_ptr The target machine's unsigned native pointer type.
|
||||
* @tparam machine_ptr_s The target machine's signed native pointer type.
|
||||
*/
|
||||
class dwarf_frame_reader {
|
||||
public:
|
||||
|
|
|
@ -62,7 +62,7 @@ namespace async {
|
|||
* on their natural order; eg, the top of the stack will be the last value in this array. If the initial stack
|
||||
* state should be empty, this value may be NULL, and @a initial_count should be 0.
|
||||
* @param initial_count Number of values in the @a initial_state array.
|
||||
* @param result[out] On success, the evaluation result. As per DWARF 3 section 2.5.1, this will be
|
||||
* @param[out] result On success, the evaluation result. As per DWARF 3 section 2.5.1, this will be
|
||||
* the top-most element on the evaluation stack. If the stack is empty, an error will be returned
|
||||
* and no value will be written to this parameter.
|
||||
*
|
||||
|
@ -135,10 +135,11 @@ plcrash_error_t plcrash_async_dwarf_expression_eval (plcrash_async_mobject_t *mo
|
|||
})
|
||||
|
||||
/* Macro to fetch register valeus; handles unsupported register numbers and missing registers values */
|
||||
#define dw_thread_regval(_dw_regnum) ({ \
|
||||
#define dw_thread_regval(dw_regnum) ({ \
|
||||
plcrash_regnum_t rn; \
|
||||
uint64_t _dw_regnum = dw_regnum; \
|
||||
if (!plcrash_async_thread_state_map_dwarf_to_reg(thread_state, _dw_regnum, &rn)) { \
|
||||
PLCF_DEBUG("Unsupported DWARF register value of 0x%" PRIx64, (uint64_t)_dw_regnum);\
|
||||
PLCF_DEBUG("Unsupported DWARF register value of 0x%" PRIx64, _dw_regnum);\
|
||||
return PLCRASH_ENOTSUP; \
|
||||
} \
|
||||
\
|
||||
|
@ -342,6 +343,7 @@ plcrash_error_t plcrash_async_dwarf_expression_eval (plcrash_async_mobject_t *mo
|
|||
|
||||
/* This can't fail after the swap suceeded */
|
||||
stack.drop();
|
||||
PLCR_FALLTHROUGH;
|
||||
|
||||
case DW_OP_deref: {
|
||||
machine_ptr addr;
|
||||
|
@ -371,6 +373,7 @@ plcrash_error_t plcrash_async_dwarf_expression_eval (plcrash_async_mobject_t *mo
|
|||
|
||||
/* This can't fail after the swap suceeded */
|
||||
stack.drop();
|
||||
PLCR_FALLTHROUGH;
|
||||
|
||||
case DW_OP_deref_size: {
|
||||
/* Fetch the target size */
|
||||
|
@ -443,8 +446,8 @@ plcrash_error_t plcrash_async_dwarf_expression_eval (plcrash_async_mobject_t *mo
|
|||
return PLCRASH_EINVAL;
|
||||
}
|
||||
|
||||
machine_ptr result = dividend / divisor;
|
||||
dw_expr_push(result);
|
||||
machine_ptr quotient = dividend / divisor;
|
||||
dw_expr_push(quotient);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -469,8 +472,8 @@ plcrash_error_t plcrash_async_dwarf_expression_eval (plcrash_async_mobject_t *mo
|
|||
return PLCRASH_EINVAL;
|
||||
}
|
||||
|
||||
machine_ptr result = dividend % divisor;
|
||||
dw_expr_push(result);
|
||||
machine_ptr remainder = dividend % divisor;
|
||||
dw_expr_push(remainder);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -625,22 +628,22 @@ plcrash_error_t plcrash_async_dwarf_expression_eval (plcrash_async_mobject_t *mo
|
|||
}
|
||||
|
||||
case DW_OP_skip: {
|
||||
int16_t offset = dw_expr_read_int(int16_t);
|
||||
if (!opstream.skip(offset)) {
|
||||
PLCF_DEBUG("DW_OP_skip offset %" PRId16 " falls outside of opcode range", offset);
|
||||
int16_t skipOffset = dw_expr_read_int(int16_t);
|
||||
if (!opstream.skip(skipOffset)) {
|
||||
PLCF_DEBUG("DW_OP_skip offset %" PRId16 " falls outside of opcode range", skipOffset);
|
||||
return PLCRASH_EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case DW_OP_bra: {
|
||||
int16_t offset = dw_expr_read_int(int16_t);
|
||||
int16_t skipOffset = dw_expr_read_int(int16_t);
|
||||
machine_ptr cond;
|
||||
|
||||
dw_expr_pop(&cond);
|
||||
if (cond != 0) {
|
||||
if (!opstream.skip(offset)) {
|
||||
PLCF_DEBUG("DW_OP_bra offset %" PRId16 " falls outside of opcode range", offset);
|
||||
if (!opstream.skip(skipOffset)) {
|
||||
PLCF_DEBUG("DW_OP_bra offset %" PRId16 " falls outside of opcode range", skipOffset);
|
||||
return PLCRASH_EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -77,8 +77,8 @@ using namespace plcrash::async;
|
|||
|
||||
- (BOOL) is32;
|
||||
- (cpu_type_t) targetCPU;
|
||||
- (uint64_t) dwarfTestRegister;
|
||||
- (uint64_t) dwarfBadRegister;
|
||||
- (uint8_t) dwarfTestRegister;
|
||||
- (uint8_t) dwarfBadRegister;
|
||||
|
||||
@end
|
||||
|
||||
|
@ -125,7 +125,7 @@ using namespace plcrash::async;
|
|||
/**
|
||||
* Return the DWARF register number to be used for tests.
|
||||
*/
|
||||
- (uint64_t) dwarfTestRegister {
|
||||
- (uint8_t) dwarfTestRegister {
|
||||
if ([self is32])
|
||||
return TEST_THREAD_32_DWARF_REG1;
|
||||
else
|
||||
|
@ -135,7 +135,7 @@ using namespace plcrash::async;
|
|||
/**
|
||||
* Return a known-bad DWARF register to use for tests.
|
||||
*/
|
||||
- (uint64_t) dwarfBadRegister {
|
||||
- (uint8_t) dwarfBadRegister {
|
||||
if ([self is32])
|
||||
return TEST_THREAD_32_DWARF_REG_INVALID;
|
||||
else
|
||||
|
@ -192,7 +192,7 @@ using namespace plcrash::async;
|
|||
- (void) testLitN {
|
||||
for (uint64_t i = 0; i < (DW_OP_lit31 - DW_OP_lit0); i++) {
|
||||
uint8_t opcodes[] = {
|
||||
DW_OP_lit0 + i // The opcodes are defined in monotonically increasing order.
|
||||
static_cast<uint8_t>(DW_OP_lit0 + i) // The opcodes are defined in monotonically increasing order.
|
||||
};
|
||||
|
||||
PERFORM_EVAL_TEST(opcodes, uint64_t, i);
|
||||
|
@ -327,11 +327,11 @@ using namespace plcrash::async;
|
|||
plcrash_async_thread_state_set_reg(&_ts, regnum, 0xFF);
|
||||
|
||||
/* Should evaluate to value of the TEST_THREAD_DWARF_REG1 register, plus 5 (the value is sleb128 encoded) */
|
||||
uint8_t opcodes[] = { DW_OP_breg0 + [self dwarfTestRegister], 0x5 };
|
||||
uint8_t opcodes[] = { static_cast<uint8_t>(DW_OP_breg0 + [self dwarfTestRegister]), 0x5 };
|
||||
PERFORM_EVAL_TEST(opcodes, uint64_t, 0xFF+5);
|
||||
|
||||
/* Should evaluate to value of the TEST_THREAD_DWARF_REG1 register, minus 2 (the value is sleb128 encoded)*/
|
||||
uint8_t opcodes_negative[] = { DW_OP_breg0 + [self dwarfTestRegister], 0x7e };
|
||||
uint8_t opcodes_negative[] = { static_cast<uint8_t>(DW_OP_breg0 + [self dwarfTestRegister]), 0x7e };
|
||||
PERFORM_EVAL_TEST(opcodes_negative, uint64_t, 0xFF-2);
|
||||
}
|
||||
|
||||
|
@ -646,7 +646,7 @@ using namespace plcrash::async;
|
|||
|
||||
/** Test evaluation of DW_OP_shra */
|
||||
- (void) testShiftRightArithmetic {
|
||||
uint8_t opcodes[] = { DW_OP_const1s, -10, DW_OP_const1u, 0x1, DW_OP_shra };
|
||||
uint8_t opcodes[] = { DW_OP_const1s, static_cast<uint8_t>(-10), DW_OP_const1u, 0x1, DW_OP_shra };
|
||||
PERFORM_EVAL_TEST(opcodes, int32_t, -10>>1);
|
||||
}
|
||||
|
||||
|
|
|
@ -49,8 +49,7 @@ using namespace plcrash::async;
|
|||
*
|
||||
* @param info The FDE record to be initialized.
|
||||
* @param mobj The memory object containing frame data (eh_frame or debug_frame) at the start address.
|
||||
* @param byteoder The byte order of the data referenced by @a mobj.
|
||||
* @param address_size The native address size of the target architecture.
|
||||
* @param byteorder The byte order of the data referenced by @a mobj.
|
||||
* @param fde_address The target-relative address containing the FDE data to be decoded. This must include
|
||||
* the length field of the FDE.
|
||||
* @param debug_frame If true, interpret the DWARF data as a debug_frame section. Otherwise, the
|
||||
|
@ -244,18 +243,18 @@ void plcrash::async::plcrash_async_dwarf_fde_info_free (plcrash_async_dwarf_fde_
|
|||
|
||||
/* Provide explicit 32/64-bit instantiations */
|
||||
template
|
||||
plcrash_error_t plcrash_async_dwarf_fde_info_init<uint32_t> (plcrash_async_dwarf_fde_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
pl_vm_address_t fde_address,
|
||||
bool debug_frame);
|
||||
plcrash_error_t plcrash::async::plcrash_async_dwarf_fde_info_init<uint32_t> (plcrash_async_dwarf_fde_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
pl_vm_address_t fde_address,
|
||||
bool debug_frame);
|
||||
|
||||
template
|
||||
plcrash_error_t plcrash_async_dwarf_fde_info_init<uint64_t> (plcrash_async_dwarf_fde_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
pl_vm_address_t fde_address,
|
||||
bool debug_frame);
|
||||
plcrash_error_t plcrash::async::plcrash_async_dwarf_fde_info_init<uint64_t> (plcrash_async_dwarf_fde_info_t *info,
|
||||
plcrash_async_mobject_t *mobj,
|
||||
const plcrash_async_byteorder_t *byteorder,
|
||||
pl_vm_address_t fde_address,
|
||||
bool debug_frame);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
|
|
@ -187,10 +187,10 @@ template <typename machine_ptr> plcrash_error_t gnu_ehptr_reader<machine_ptr>::r
|
|||
|
||||
/* Compute the offset+alignment relative to the section base */
|
||||
PLCF_ASSERT(location >= _frame_section_base);
|
||||
machine_ptr offset = location - _frame_section_base;
|
||||
machine_ptr locationOffset = location - _frame_section_base;
|
||||
|
||||
/* Apply to the VM load address for the section. */
|
||||
machine_ptr vm_addr = _frame_section_vm_addr + offset;
|
||||
machine_ptr vm_addr = _frame_section_vm_addr + locationOffset;
|
||||
machine_ptr vm_aligned = (vm_addr + (sizeof(machine_ptr)-1)) & ~(sizeof(machine_ptr)-1);
|
||||
|
||||
/* Apply the new offset to the actual load address */
|
||||
|
@ -530,8 +530,8 @@ plcrash_error_t plcrash::async::plcrash_async_dwarf_read_sleb128 (plcrash_async_
|
|||
}
|
||||
|
||||
/* Provide explicit 32/64-bit instantiations */
|
||||
template class gnu_ehptr_reader<uint32_t>;
|
||||
template class gnu_ehptr_reader<uint64_t>;
|
||||
template class plcrash::async::gnu_ehptr_reader<uint32_t>;
|
||||
template class plcrash::async::gnu_ehptr_reader<uint64_t>;
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -67,10 +67,10 @@ public:
|
|||
void *ptr = malloc(size);
|
||||
PLCF_ASSERT(ptr != NULL);
|
||||
return ptr;
|
||||
};
|
||||
}
|
||||
void operator delete (void *ptr) {
|
||||
free(ptr);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the list item value.
|
||||
|
@ -127,8 +127,8 @@ public:
|
|||
void *ptr = malloc(size);
|
||||
PLCF_ASSERT(ptr != NULL);
|
||||
return ptr;
|
||||
};
|
||||
void operator delete (void *ptr) { free(ptr); };
|
||||
}
|
||||
void operator delete (void *ptr) { free(ptr); }
|
||||
|
||||
/**
|
||||
* Sanity check list validity. Intended to be used from the unit tests; will fire
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLCrashAsyncMObject.h"
|
||||
#include "PLCrashAsyncMObject.h"
|
||||
|
||||
#import <stdint.h>
|
||||
#import <inttypes.h>
|
||||
#include <stdint.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
/**
|
||||
* @internal
|
||||
|
@ -46,14 +46,14 @@
|
|||
* VM_PROT_READ.
|
||||
*
|
||||
* @param task The task from which the memory will be mapped.
|
||||
* @param task_address The task-relative address of the memory to be mapped. This is not required to fall on a page boundry.
|
||||
* @param task_addr The task-relative address of the memory to be mapped. This is not required to fall on a page boundry.
|
||||
* @param length The total size of the mapping to create.
|
||||
* @param require_full If false, short mappings will be permitted in the case where a memory object of the requested length
|
||||
* does not exist at the target address. It is the caller's responsibility to validate the resulting length of the
|
||||
* mapping, eg, using plcrash_async_mobject_remap_address() and similar. If true, and the entire requested page range is
|
||||
* not valid, the mapping request will fail.
|
||||
* @param result[out] The in-process address at which the pages were mapped.
|
||||
* @param result_length[out] The total size, in bytes, of the mapped pages.
|
||||
* @param[out] result The in-process address at which the pages were mapped.
|
||||
* @param[out] result_length The total size, in bytes, of the mapped pages.
|
||||
*
|
||||
* @return On success, returns PLCRASH_ESUCCESS. On failure, one of the plcrash_error_t error values will be returned, and no
|
||||
* mapping will be performed.
|
||||
|
@ -245,7 +245,7 @@ static plcrash_error_t plcrash_async_mobject_remap_pages_workaround (mach_port_t
|
|||
*
|
||||
* @param mobj Memory object to be initialized.
|
||||
* @param task The task from which the memory will be mapped.
|
||||
* @param task_address The task-relative address of the memory to be mapped. This is not required to fall on a page boundry.
|
||||
* @param task_addr The task-relative address of the memory to be mapped. This is not required to fall on a page boundry.
|
||||
* @param length The total size of the mapping to create.
|
||||
* @param require_full If false, short mappings will be permitted in the case where a memory object of the requested length
|
||||
* does not exist at the target address. It is the caller's responsibility to validate the resulting length of the
|
||||
|
@ -370,7 +370,7 @@ void *plcrash_async_mobject_remap_address (plcrash_async_mobject_t *mobj, pl_vm_
|
|||
if (!plcrash_async_mobject_verify_local_pointer(mobj, (uintptr_t) remapped, offset, length))
|
||||
return NULL;
|
||||
|
||||
return (void *) remapped + offset;
|
||||
return (void *) (remapped + offset);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
* Map a Mach exception to its BSD signal representation.
|
||||
*
|
||||
* @param exception_type Mach exception type.
|
||||
* @param code Mach exception codes.
|
||||
* @param codes Mach exception codes.
|
||||
* @param code_count The number of codes provided.
|
||||
* @param cpu_type The target architecture on which the exception was generated, encoded as a Mach-O CPU type. Interpreting Mach exception data is
|
||||
* architecture-specific. If the CPU type is unknown, CPU_TYPE_ANY may be provided.
|
||||
|
|
|
@ -74,11 +74,10 @@ plcrash_error_t plcrash_nasync_macho_init (plcrash_async_macho_t *image, mach_po
|
|||
task_initialized = true;
|
||||
|
||||
/* Read in the Mach-O header */
|
||||
kern_return_t kt;
|
||||
if ((kt = plcrash_async_read_addr(image->task, image->header_addr, &image->header, sizeof(image->header))) != KERN_SUCCESS) {
|
||||
if ((ret = plcrash_async_task_memcpy(image->task, image->header_addr, 0, &image->header, sizeof(image->header))) != PLCRASH_ESUCCESS) {
|
||||
/* NOTE: The image struct must be fully initialized before returning here, as otherwise our _free() function
|
||||
* will crash */
|
||||
PLCF_DEBUG("Failed to read Mach-O header from 0x%" PRIx64 " for image %s, kern_error=%d", (uint64_t) image->header_addr, name, kt);
|
||||
PLCF_DEBUG("Failed to read Mach-O header from 0x%" PRIx64 " for image %s, ret=%d", (uint64_t) image->header_addr, name, ret);
|
||||
ret = PLCRASH_EINTERNAL;
|
||||
goto error;
|
||||
}
|
||||
|
@ -405,9 +404,6 @@ void *plcrash_async_macho_find_command (plcrash_async_macho_t *image, uint32_t e
|
|||
*
|
||||
* @param image The image to search for @a segname.
|
||||
* @param segname The name of the segment to search for.
|
||||
* @param outAddress On successful return, contains the address of the found segment.
|
||||
* @param outCmd_32 On successful return with a 32-bit image, contains the segment header.
|
||||
* @param outCmd_64 On successful return with a 64-bit image, contains the segment header.
|
||||
*
|
||||
* @return Returns a mapped pointer to the segment on success, or NULL on failure.
|
||||
*/
|
||||
|
|
|
@ -182,7 +182,7 @@ typedef struct plcrash_async_macho_symtab_reader {
|
|||
* @param address The symbol address.
|
||||
* @param name The symbol name. The callback is responsible for copying this value, as its backing storage is not gauranteed to exist
|
||||
* after the callback returns.
|
||||
* @param context The API client's supplied context value.
|
||||
* @param ctx The API client's supplied context value.
|
||||
*/
|
||||
typedef void (*pl_async_macho_found_symbol_cb)(pl_vm_address_t address, const char *name, void *ctx);
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ const uint64_t PLCRASH_ASYNC_OBJC_ISA_NONPTR_CLASS_MASK = plcrash_async_image_ob
|
|||
* Class's rw data structure has been realized.
|
||||
** If set, data pointers to RW data instead of RO.
|
||||
*/
|
||||
static const uint32_t RW_REALIZED = (1<<31);
|
||||
static const uint32_t RW_REALIZED = (1U<<31);
|
||||
|
||||
/**
|
||||
* @internal
|
||||
|
@ -258,7 +258,7 @@ struct pl_objc2_list_header {
|
|||
* if the cache size has been set.
|
||||
*
|
||||
* @param context The context.
|
||||
* @param The key.
|
||||
* @param key The key.
|
||||
* @return The index.
|
||||
*/
|
||||
static size_t cache_index (plcrash_async_objc_cache_t *context, pl_vm_address_t key) {
|
||||
|
|
|
@ -138,7 +138,7 @@ static void ParseCallbackTrampoline(bool isClassMethod, plcrash_async_macho_stri
|
|||
}
|
||||
|
||||
- (void) testParse {
|
||||
plcrash_error_t err;
|
||||
__block plcrash_error_t err;
|
||||
|
||||
plcrash_async_objc_cache_t objCContext;
|
||||
err = plcrash_async_objc_cache_init(&objCContext);
|
||||
|
@ -148,7 +148,6 @@ static void ParseCallbackTrampoline(bool isClassMethod, plcrash_async_macho_stri
|
|||
uint64_t pc = [[[NSThread callStackReturnAddresses] objectAtIndex: 0] unsignedLongLongValue];
|
||||
err = plcrash_async_objc_find_method(&_image, &objCContext, pc, ParseCallbackTrampoline, ^(bool isClassMethod, plcrash_async_macho_string_t *className, plcrash_async_macho_string_t *methodName, pl_vm_address_t imp, void *ctx) {
|
||||
didCall = YES;
|
||||
plcrash_error_t err;
|
||||
|
||||
pl_vm_size_t classNameLength;
|
||||
const char *classNamePtr;
|
||||
|
@ -178,7 +177,6 @@ static void ParseCallbackTrampoline(bool isClassMethod, plcrash_async_macho_stri
|
|||
didCall = NO;
|
||||
err = plcrash_async_objc_find_method(&_image, &objCContext, [self addressInCategory], ParseCallbackTrampoline, ^(bool isClassMethod, plcrash_async_macho_string_t *className, plcrash_async_macho_string_t *methodName, pl_vm_address_t imp, void *ctx) {
|
||||
didCall = YES;
|
||||
plcrash_error_t err;
|
||||
|
||||
pl_vm_size_t classNameLength;
|
||||
const char *classNamePtr;
|
||||
|
@ -209,7 +207,6 @@ static void ParseCallbackTrampoline(bool isClassMethod, plcrash_async_macho_stri
|
|||
didCall = NO;
|
||||
err = plcrash_async_objc_find_method(&_image, &objCContext, [obj addressInSimpleClass], ParseCallbackTrampoline, ^(bool isClassMethod, plcrash_async_macho_string_t *className, plcrash_async_macho_string_t *methodName, pl_vm_address_t imp, void *ctx) {
|
||||
didCall = YES;
|
||||
plcrash_error_t err;
|
||||
|
||||
pl_vm_size_t classNameLength;
|
||||
const char *classNamePtr;
|
||||
|
@ -239,7 +236,6 @@ static void ParseCallbackTrampoline(bool isClassMethod, plcrash_async_macho_stri
|
|||
didCall = NO;
|
||||
err = plcrash_async_objc_find_method(&_image, &objCContext, [[self class] addressInClassMethod], ParseCallbackTrampoline, ^(bool isClassMethod, plcrash_async_macho_string_t *className, plcrash_async_macho_string_t *methodName, pl_vm_address_t imp, void *ctx) {
|
||||
didCall = YES;
|
||||
plcrash_error_t err;
|
||||
|
||||
pl_vm_size_t classNameLength;
|
||||
const char *classNamePtr;
|
||||
|
|
|
@ -28,8 +28,8 @@
|
|||
|
||||
#include "PLCrashAsyncSignalInfo.h"
|
||||
|
||||
#import <unistd.h>
|
||||
#import <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
/**
|
||||
* @ingroup plcrash_async_signal_info
|
||||
|
|
|
@ -129,7 +129,7 @@ plcrash_error_t plcrash_async_find_symbol (plcrash_async_macho_t *image,
|
|||
*
|
||||
* @param str String to which character should be appended.
|
||||
* @param c Character to append.
|
||||
* @param cursorPtr Cursor used to store the current write position.
|
||||
* @param cursor Cursor used to store the current write position.
|
||||
* @param limit Maximum number of bytes that may be written to @a str.
|
||||
*
|
||||
* @return Returns true if the character was appended successfully, false
|
||||
|
|
|
@ -102,7 +102,7 @@ void plcrash_async_symbol_cache_free (plcrash_async_symbol_cache_t *cache);
|
|||
* @param address The symbol address.
|
||||
* @param name The symbol name. The callback is responsible for copying this value, as its backing storage is not gauranteed to exist
|
||||
* after the callback returns.
|
||||
* @param context The API client's supplied context value.
|
||||
* @param ctx The API client's supplied context value.
|
||||
*/
|
||||
typedef void (*plcrash_async_found_symbol_cb)(pl_vm_address_t address, const char *name, void *ctx);
|
||||
|
||||
|
|
|
@ -91,6 +91,8 @@ static void testFindSymbol_cb (pl_vm_address_t address, const char *name, void *
|
|||
cb_ctx->name = strdup(name);
|
||||
}
|
||||
|
||||
/* For the tests below, this must be non-static. */
|
||||
void PLCrashAsyncLocalSymbolicationTestsDummyFunction(void);
|
||||
void PLCrashAsyncLocalSymbolicationTestsDummyFunction(void) {}
|
||||
|
||||
- (void) testFindSymbol {
|
||||
|
|
|
@ -77,19 +77,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
- (void) test_readAddr {
|
||||
const char bytes[] = "Hello";
|
||||
char dest[sizeof(bytes)];
|
||||
|
||||
// Verify that a good read succeeds
|
||||
plcrash_async_read_addr(mach_task_self(), (pl_vm_address_t) bytes, dest, sizeof(dest));
|
||||
STAssertTrue(strcmp(bytes, dest) == 0, @"Read was not performed");
|
||||
|
||||
// Verify that reading off the page at 0x0 fails
|
||||
STAssertNotEquals(KERN_SUCCESS, plcrash_async_read_addr(mach_task_self(), 0, dest, sizeof(bytes)), @"Bad read was performed");
|
||||
}
|
||||
|
||||
|
||||
- (void) testApplyAddress {
|
||||
pl_vm_address_t result;
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@ plcrash_error_t plcrash_async_thread_state_init (plcrash_async_thread_state_t *t
|
|||
* Initialize the @a thread_state using the provided context.
|
||||
*
|
||||
* @param thread_state The thread state to be initialized.
|
||||
* @param uap The context to use for cursor initialization.
|
||||
* @param mctx The context to use for cursor initialization.
|
||||
*
|
||||
* All registers will be marked as available.
|
||||
*/
|
||||
|
|
|
@ -173,11 +173,11 @@ typedef enum {
|
|||
/**
|
||||
* Invalid register. This value must not be assigned to a platform register.
|
||||
*/
|
||||
PLCRASH_REG_INVALID = UINT32_MAX
|
||||
PLCRASH_REG_INVALID = INT32_MAX
|
||||
} plcrash_gen_regnum_t;
|
||||
|
||||
#import "PLCrashAsyncThread_x86.h"
|
||||
#import "PLCrashAsyncThread_arm.h"
|
||||
#include "PLCrashAsyncThread_x86.h"
|
||||
#include "PLCrashAsyncThread_arm.h"
|
||||
|
||||
/** Platform word type */
|
||||
typedef plcrash_pdef_greg_t plcrash_greg_t;
|
||||
|
@ -247,7 +247,7 @@ void plcrash_async_thread_state_clear_volatile_regs (plcrash_async_thread_state_
|
|||
|
||||
/**
|
||||
* Map a plcrash_regnum_t to its corresponding DWARF register value. Returns true if a mapping is available
|
||||
* for @regnum, or false if no DWARF register value is available for @a regnum.
|
||||
* for @a regnum, or false if no DWARF register value is available for @a regnum.
|
||||
*
|
||||
* @warning This API may require changes in the future to support specifying the register mapping type; eg, DWARF debug_frame
|
||||
* vs eh_frame, or similar.
|
||||
|
@ -255,7 +255,7 @@ void plcrash_async_thread_state_clear_volatile_regs (plcrash_async_thread_state_
|
|||
*
|
||||
* @param thread_state The thread state to be used for performing the mapping.
|
||||
* @param regnum The register number to be mapped.
|
||||
* @param dwarf_reg[out] The mapped DWARF register value.
|
||||
* @param[out] dwarf_reg The mapped DWARF register value.
|
||||
*/
|
||||
bool plcrash_async_thread_state_map_reg_to_dwarf (plcrash_async_thread_state_t *thread_state, plcrash_regnum_t regnum, uint64_t *dwarf_reg);
|
||||
|
||||
|
@ -268,7 +268,7 @@ bool plcrash_async_thread_state_map_reg_to_dwarf (plcrash_async_thread_state_t *
|
|||
*
|
||||
* @param thread_state The thread state to be used for performing the mapping.
|
||||
* @param dwarf_reg The DWARF register number to be mapped.
|
||||
* @param regnum[out] The mapped register number.
|
||||
* @param[out] regnum The mapped register number.
|
||||
*/
|
||||
bool plcrash_async_thread_state_map_dwarf_to_reg (const plcrash_async_thread_state_t *thread_state, uint64_t dwarf_reg, plcrash_regnum_t *regnum);
|
||||
|
||||
|
|
|
@ -26,12 +26,12 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLCrashAsyncThread.h"
|
||||
#import "PLCrashAsync.h"
|
||||
#include "PLCrashAsyncThread.h"
|
||||
#include "PLCrashAsync.h"
|
||||
|
||||
#import <signal.h>
|
||||
#import <stdlib.h>
|
||||
#import <assert.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#if defined(__arm__) || defined(__arm64__)
|
||||
|
||||
|
|
|
@ -59,6 +59,12 @@ extern "C" {
|
|||
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
plcrash_error_t plcrash_async_thread_state_current_stub (plcrash_async_thread_state_current_callback callback,
|
||||
void *context,
|
||||
pl_mcontext_t *mctx);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -26,12 +26,12 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLCrashAsyncThread.h"
|
||||
#import "PLCrashAsync.h"
|
||||
#include "PLCrashAsyncThread.h"
|
||||
#include "PLCrashAsync.h"
|
||||
|
||||
#import <signal.h>
|
||||
#import <assert.h>
|
||||
#import <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define RETGEN(name, type, ts) {\
|
||||
return (ts->x86_state. type . __ ## name); \
|
||||
|
|
|
@ -91,13 +91,11 @@ plframe_error_t plframe_cursor_read_frame_ptr (task_t task,
|
|||
/* Read the registers off the stack via the frame pointer */
|
||||
plcrash_greg_t new_fp;
|
||||
plcrash_greg_t new_pc;
|
||||
kern_return_t kr;
|
||||
plcrash_error_t err;
|
||||
|
||||
|
||||
|
||||
kr = plcrash_async_read_addr(task, (pl_vm_address_t) fp, dest, len);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
PLCF_DEBUG("Failed to read frame: %d", kr);
|
||||
err = plcrash_async_task_memcpy(task, (pl_vm_address_t) fp, 0, dest, len);
|
||||
if (err != PLCRASH_ESUCCESS) {
|
||||
PLCF_DEBUG("Failed to read frame: %d", err);
|
||||
return PLFRAME_EBADFRAME;
|
||||
}
|
||||
|
||||
|
|
|
@ -65,48 +65,6 @@ const char *plframe_strerror (plframe_error_t error) {
|
|||
return "Unhandled error code";
|
||||
}
|
||||
|
||||
#pragma mark Test Thread
|
||||
|
||||
/* A thread that exists just to give us a stack to iterate */
|
||||
static void *test_stack_thr (void *arg) {
|
||||
plcrash_test_thread_t *args = arg;
|
||||
|
||||
/* Acquire the lock and inform our caller that we're active */
|
||||
pthread_mutex_lock(&args->lock);
|
||||
pthread_cond_signal(&args->cond);
|
||||
|
||||
/* Wait for a shut down request, and then drop the acquired lock immediately */
|
||||
pthread_cond_wait(&args->cond, &args->lock);
|
||||
pthread_mutex_unlock(&args->lock);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/** Spawn a test thread that may be used as an iterable stack. (For testing only!) */
|
||||
void plframe_test_thread_spawn (plcrash_test_thread_t *args) {
|
||||
/* Initialize the args */
|
||||
pthread_mutex_init(&args->lock, NULL);
|
||||
pthread_cond_init(&args->cond, NULL);
|
||||
|
||||
/* Lock and start the thread */
|
||||
pthread_mutex_lock(&args->lock);
|
||||
pthread_create(&args->thread, NULL, test_stack_thr, args);
|
||||
pthread_cond_wait(&args->cond, &args->lock);
|
||||
pthread_mutex_unlock(&args->lock);
|
||||
}
|
||||
|
||||
/** Stop a test thread. */
|
||||
void plframe_test_thread_stop (plcrash_test_thread_t *args) {
|
||||
/* Signal the thread to exit */
|
||||
pthread_mutex_lock(&args->lock);
|
||||
pthread_cond_signal(&args->cond);
|
||||
pthread_mutex_unlock(&args->lock);
|
||||
|
||||
/* Wait for exit */
|
||||
pthread_join(args->thread, NULL);
|
||||
}
|
||||
|
||||
#pragma mark Frame Walking
|
||||
|
||||
/**
|
||||
|
@ -134,7 +92,7 @@ static void plframe_cursor_internal_init (plframe_cursor_t *cursor, task_t task,
|
|||
*
|
||||
* @return Returns PLFRAME_ESUCCESS on success, or standard plframe_error_t code if an error occurs.
|
||||
*
|
||||
* @warn Callers must call plframe_cursor_free() on @a cursor to free any associated resources, even if initialization
|
||||
* @warning Callers must call plframe_cursor_free() on @a cursor to free any associated resources, even if initialization
|
||||
* fails.
|
||||
*/
|
||||
plframe_error_t plframe_cursor_init (plframe_cursor_t *cursor, task_t task, plcrash_async_thread_state_t *thread_state, plcrash_async_image_list_t *image_list) {
|
||||
|
@ -156,7 +114,7 @@ plframe_error_t plframe_cursor_init (plframe_cursor_t *cursor, task_t task, plcr
|
|||
*
|
||||
* @return Returns PLFRAME_ESUCCESS on success, or standard plframe_error_t code if an error occurs.
|
||||
*
|
||||
* @warn Callers must call plframe_cursor_free() on @a cursor to free any associated resources, even if initialization
|
||||
* @warning Callers must call plframe_cursor_free() on @a cursor to free any associated resources, even if initialization
|
||||
* fails.
|
||||
*/
|
||||
plframe_error_t plframe_cursor_thread_init (plframe_cursor_t *cursor, task_t task, thread_t thread, plcrash_async_image_list_t *image_list) {
|
||||
|
|
|
@ -29,14 +29,14 @@
|
|||
#ifndef PLCRASH_FRAMEWALKER_H
|
||||
#define PLCRASH_FRAMEWALKER_H
|
||||
|
||||
#import <sys/ucontext.h>
|
||||
#import <pthread.h>
|
||||
#include <sys/ucontext.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#import <stdint.h>
|
||||
#import <stdbool.h>
|
||||
#import <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#import <mach/mach.h>
|
||||
#include <mach/mach.h>
|
||||
|
||||
#include "PLCrashAsyncThread.h"
|
||||
#include "PLCrashAsyncImageList.h"
|
||||
|
|
|
@ -133,7 +133,7 @@ enum {
|
|||
/** CrashReport.thread.register.name */
|
||||
PLCRASH_PROTO_THREAD_REGISTER_NAME_ID = 1,
|
||||
|
||||
/** CrashReport.thread.register.name */
|
||||
/** CrashReport.thread.register.value */
|
||||
PLCRASH_PROTO_THREAD_REGISTER_VALUE_ID = 2,
|
||||
|
||||
|
||||
|
@ -439,15 +439,15 @@ plcrash_error_t plcrash_log_writer_init (plcrash_log_writer_t *writer,
|
|||
/* Fetch the major, minor, and bugfix versions.
|
||||
* Fetching the OS version should not fail. */
|
||||
if (Gestalt(gestaltSystemVersionMajor, &major) != noErr) {
|
||||
PLCF_DEBUG("Could not retreive system major version with Gestalt");
|
||||
PLCF_DEBUG("Could not retrieve system major version with Gestalt");
|
||||
return PLCRASH_EINTERNAL;
|
||||
}
|
||||
if (Gestalt(gestaltSystemVersionMinor, &minor) != noErr) {
|
||||
PLCF_DEBUG("Could not retreive system minor version with Gestalt");
|
||||
PLCF_DEBUG("Could not retrieve system minor version with Gestalt");
|
||||
return PLCRASH_EINTERNAL;
|
||||
}
|
||||
if (Gestalt(gestaltSystemVersionBugFix, &bugfix) != noErr) {
|
||||
PLCF_DEBUG("Could not retreive system bugfix version with Gestalt");
|
||||
PLCF_DEBUG("Could not retrieve system bugfix version with Gestalt");
|
||||
return PLCRASH_EINTERNAL;
|
||||
}
|
||||
|
||||
|
@ -591,7 +591,7 @@ static size_t plcrash_writer_write_system_info (plcrash_async_file_t *file, plcr
|
|||
*
|
||||
* @param file Output file
|
||||
* @param cpu_type The Mach CPU type.
|
||||
* @param cpu_subtype_t The Mach CPU subtype
|
||||
* @param cpu_subtype The Mach CPU subtype
|
||||
*/
|
||||
static size_t plcrash_writer_write_processor_info (plcrash_async_file_t *file, uint64_t cpu_type, uint64_t cpu_subtype) {
|
||||
size_t rv = 0;
|
||||
|
@ -738,10 +738,11 @@ static size_t plcrash_writer_write_process_info (plcrash_async_file_t *file, con
|
|||
/**
|
||||
* @internal
|
||||
*
|
||||
* Write a thread backtrace register
|
||||
* Write a single register.
|
||||
*
|
||||
* @param file Output file
|
||||
* @param cursor The cursor from which to acquire frame data.
|
||||
* @param regname The register to write's name.
|
||||
* @param regval The register to write's value.
|
||||
*/
|
||||
static size_t plcrash_writer_write_thread_register (plcrash_async_file_t *file, const char *regname, plcrash_greg_t regval) {
|
||||
uint64_t uint64val;
|
||||
|
@ -996,8 +997,7 @@ static size_t plcrash_writer_write_thread (plcrash_async_file_t *file,
|
|||
* Write a binary image frame
|
||||
*
|
||||
* @param file Output file
|
||||
* @param name binary image path (or name).
|
||||
* @param image_base Mach-O image base.
|
||||
* @param image Mach-O image.
|
||||
*/
|
||||
static size_t plcrash_writer_write_binary_image (plcrash_async_file_t *file, plcrash_async_macho_t *image) {
|
||||
size_t rv = 0;
|
||||
|
|
|
@ -21,9 +21,9 @@
|
|||
* -landonf dec 12, 2008
|
||||
*/
|
||||
|
||||
#import <stdint.h>
|
||||
#import <string.h>
|
||||
#import <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "PLCrashLogWriterEncoding.h"
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#import "PLCrashAsync.h"
|
||||
#include "PLCrashAsync.h"
|
||||
|
||||
typedef enum {
|
||||
PLPROTOBUF_C_TYPE_INT32,
|
||||
|
|
|
@ -97,7 +97,10 @@
|
|||
|
||||
STAssertNotNULL(systemInfo->os_version, @"No OS version encoded");
|
||||
|
||||
STAssertEquals((int) systemInfo->architecture, PLCrashReportHostArchitecture, @"Unexpected machine type");
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated"
|
||||
STAssertEquals(systemInfo->architecture, PLCrashReportHostArchitecture, @"Unexpected machine type");
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
STAssertTrue(systemInfo->timestamp != 0, @"Timestamp uninitialized");
|
||||
}
|
||||
|
@ -416,15 +419,15 @@
|
|||
#endif
|
||||
BOOL foundCrashed = NO;
|
||||
for (int i = 0; i < crashReport->n_threads; i++) {
|
||||
Plcrash__CrashReport__Thread *thread = crashReport->threads[i];
|
||||
if (!thread->crashed)
|
||||
Plcrash__CrashReport__Thread *reportThread = crashReport->threads[i];
|
||||
if (!reportThread->crashed)
|
||||
continue;
|
||||
|
||||
foundCrashed = YES;
|
||||
|
||||
/* Load the first frame */
|
||||
STAssertNotEquals((size_t)0, thread->n_frames, @"No frames available in backtrace");
|
||||
Plcrash__CrashReport__Thread__StackFrame *f = thread->frames[0];
|
||||
STAssertNotEquals((size_t)0, reportThread->n_frames, @"No frames available in backtrace");
|
||||
Plcrash__CrashReport__Thread__StackFrame *f = reportThread->frames[0];
|
||||
|
||||
/* Validate PC. This check is inexact, as otherwise we would need to carefully instrument the
|
||||
* call to plcrash_log_writer_write_curthread() in order to determine the exact PC value. */
|
||||
|
|
|
@ -80,9 +80,9 @@
|
|||
* Initialize a new instance with the given async-safe C representation. The receiver will assume ownership of the associated mach ports, and
|
||||
* will decrement their reference count upon deallocation.
|
||||
*
|
||||
* @param set A set of up to EXC_TYPES_COUNT PLCrashMachExceptionPortState instances.
|
||||
* @param asyncSafeRepresentation An async-safe representation of the port state set (@sa plcrash_mach_exception_port_set_t)
|
||||
*
|
||||
* @warning If @a set contains more than EXC_TYPES_COUNT instances, an exception will be thrown.
|
||||
* @warning If @a asyncSafeRepresentation contains more than EXC_TYPES_COUNT instances, an exception will be thrown.
|
||||
*/
|
||||
- (id) initWithAsyncSafeRepresentation: (plcrash_mach_exception_port_set_t) asyncSafeRepresentation {
|
||||
if ((self = [super init]) == nil)
|
||||
|
|
|
@ -60,12 +60,59 @@
|
|||
# define PLCR_PRAGMA_CLANG(_p)
|
||||
#endif
|
||||
|
||||
#ifdef __clang__
|
||||
# define PLCR_DEPRECATED __attribute__((deprecated))
|
||||
#else
|
||||
# define PLCR_DEPRECATED
|
||||
#endif
|
||||
|
||||
#if defined(__clang__) || defined(__GNUC__)
|
||||
# define PLCR_UNUSED __attribute__((unused))
|
||||
#else
|
||||
# define PLCR_UNUSED
|
||||
#endif
|
||||
|
||||
#ifdef PLCR_PRIVATE
|
||||
/**
|
||||
* Marks a definition as deprecated only for for external clients, allowing
|
||||
* uses of it internal fo the framework.
|
||||
*/
|
||||
# define PLCR_EXTERNAL_DEPRECATED
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* A macro to put above a definition marked PLCR_EXTERNAL_DEPRECATED that will
|
||||
* silence warnings about there being a deprecation documentation marker but the
|
||||
* definition not being marked deprecated.
|
||||
*/
|
||||
# define PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH() \
|
||||
PLCR_PRAGMA_CLANG("clang diagnostic push"); \
|
||||
PLCR_PRAGMA_CLANG("clang diagnostic ignored \"-Wdocumentation-deprecated-sync\"")
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* A macro to put below a definition marked PLCR_EXTERNAL_DEPRECATED that will
|
||||
* silence warnings about there being a deprecation documentation marker but the
|
||||
* definition not being marked deprecated.
|
||||
*/
|
||||
# define PLCR_EXTERNAL_DEPRECATED_NOWARN_POP() PLCR_PRAGMA_CLANG("clang diagnostic pop")
|
||||
|
||||
#else
|
||||
|
||||
# define PLCR_EXTERNAL_DEPRECATED PLCR_DEPRECATED
|
||||
# define PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH()
|
||||
# define PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH()
|
||||
|
||||
#endif /* PLCR_PRIVATE */
|
||||
|
||||
#ifdef PLCR_PRIVATE
|
||||
# if defined(__clang__) && __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
|
||||
# define PLCR_FALLTHROUGH [[clang::fallthrough]]
|
||||
# else
|
||||
# define PLCR_FALLTHROUGH do {} while (0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef PLCR_PRIVATE
|
||||
/**
|
||||
* @internal
|
||||
|
|
|
@ -35,12 +35,13 @@ struct _PLCrashReportDecoder {
|
|||
Plcrash__CrashReport *crashReport;
|
||||
};
|
||||
|
||||
#define IMAGE_UUID_DIGEST_LEN 16
|
||||
|
||||
@interface PLCrashReport (PrivateMethods)
|
||||
|
||||
- (Plcrash__CrashReport *) decodeCrashData: (NSData *) data error: (NSError **) outError;
|
||||
- (PLCrashReportSystemInfo *) extractSystemInfo: (Plcrash__CrashReport__SystemInfo *) systemInfo error: (NSError **) outError;
|
||||
- (PLCrashReportSystemInfo *) extractSystemInfo: (Plcrash__CrashReport__SystemInfo *) systemInfo
|
||||
processorInfo: (PLCrashReportProcessorInfo *) processorInfo
|
||||
error: (NSError **) outError;
|
||||
- (PLCrashReportProcessorInfo *) synthesizeProcessorInfoFromArchitecture: (Plcrash__Architecture) architecture error: (NSError **) outError;
|
||||
- (PLCrashReportProcessorInfo *) extractProcessorInfo: (Plcrash__CrashReport__Processor *) processorInfo error: (NSError **) outError;
|
||||
- (PLCrashReportMachineInfo *) extractMachineInfo: (Plcrash__CrashReport__MachineInfo *) machineInfo error: (NSError **) outError;
|
||||
- (PLCrashReportApplicationInfo *) extractApplicationInfo: (Plcrash__CrashReport__ApplicationInfo *) applicationInfo error: (NSError **) outError;
|
||||
|
@ -112,11 +113,6 @@ static void populate_nserror (NSError **error, PLCrashReporterError code, NSStri
|
|||
}
|
||||
}
|
||||
|
||||
/* System info */
|
||||
_systemInfo = [[self extractSystemInfo: _decoder->crashReport->system_info error: outError] retain];
|
||||
if (!_systemInfo)
|
||||
goto error;
|
||||
|
||||
/* Machine info */
|
||||
if (_decoder->crashReport->machine_info != NULL) {
|
||||
_machineInfo = [[self extractMachineInfo: _decoder->crashReport->machine_info error: outError] retain];
|
||||
|
@ -124,6 +120,11 @@ static void populate_nserror (NSError **error, PLCrashReporterError code, NSStri
|
|||
goto error;
|
||||
}
|
||||
|
||||
/* System info */
|
||||
_systemInfo = [[self extractSystemInfo: _decoder->crashReport->system_info processorInfo: _machineInfo.processorInfo error: outError] retain];
|
||||
if (!_systemInfo)
|
||||
goto error;
|
||||
|
||||
/* Application info */
|
||||
_applicationInfo = [[self extractApplicationInfo: _decoder->crashReport->application_info error: outError] retain];
|
||||
if (!_applicationInfo)
|
||||
|
@ -308,8 +309,20 @@ error:
|
|||
|
||||
/**
|
||||
* Extract system information from the crash log. Returns nil on error.
|
||||
*
|
||||
* @param systemInfo The system info from the protobuf file.
|
||||
* @param processorInfo The system info from the machine info. This may be nil for v1 reports, in which case the
|
||||
* information will be synthesized from the architecture in the @a systemInfo.
|
||||
* @param outError A pointer to an NSError object variable. If an error occurs, this pointer will contain an error
|
||||
* object indicating why the system info could not be extracted. If no error occurs, this parameter will be left
|
||||
* unmodified. You may specify nil for this parameter, and no error information will be provided.
|
||||
*
|
||||
* @return Returns the system information, or nil on failure.
|
||||
*/
|
||||
- (PLCrashReportSystemInfo *) extractSystemInfo: (Plcrash__CrashReport__SystemInfo *) systemInfo error: (NSError **) outError {
|
||||
- (PLCrashReportSystemInfo *) extractSystemInfo: (Plcrash__CrashReport__SystemInfo *) systemInfo
|
||||
processorInfo: (PLCrashReportProcessorInfo *) processorInfo
|
||||
error: (NSError **) outError
|
||||
{
|
||||
NSDate *timestamp = nil;
|
||||
NSString *osBuild = nil;
|
||||
|
||||
|
@ -335,12 +348,23 @@ error:
|
|||
/* Set up the timestamp, if available */
|
||||
if (systemInfo->timestamp != 0)
|
||||
timestamp = [NSDate dateWithTimeIntervalSince1970: systemInfo->timestamp];
|
||||
|
||||
/* v1 crash logs will not have machine info, so the only data available to
|
||||
* us is the deprecated architecture field. From that we will generate a
|
||||
* PLCrashReportProcessorInfo object so that library users don't have to
|
||||
* get at the architecture information multiple ways. */
|
||||
if (processorInfo == nil) {
|
||||
processorInfo = [self synthesizeProcessorInfoFromArchitecture: systemInfo->architecture error: outError];
|
||||
if (processorInfo == nil)
|
||||
return nil;
|
||||
}
|
||||
|
||||
/* Done */
|
||||
return [[[PLCrashReportSystemInfo alloc] initWithOperatingSystem: (PLCrashReportOperatingSystem) systemInfo->operating_system
|
||||
operatingSystemVersion: [NSString stringWithUTF8String: systemInfo->os_version]
|
||||
operatingSystemBuild: osBuild
|
||||
architecture: (PLCrashReportArchitecture) systemInfo->architecture
|
||||
processorInfo: processorInfo
|
||||
timestamp: timestamp] autorelease];
|
||||
}
|
||||
|
||||
|
@ -361,6 +385,55 @@ error:
|
|||
subtype: processorInfo->subtype] autorelease];
|
||||
}
|
||||
|
||||
/**
|
||||
* Synthesize a processor information object from an architecture type. Returns nil on error.
|
||||
*/
|
||||
- (PLCrashReportProcessorInfo *) synthesizeProcessorInfoFromArchitecture: (Plcrash__Architecture) architecture error:(NSError **)outError {
|
||||
uint64_t processorType;
|
||||
uint64_t processorSubtype;
|
||||
switch (architecture) {
|
||||
case PLCRASH__ARCHITECTURE__X86_32:
|
||||
processorType = CPU_TYPE_X86;
|
||||
processorSubtype = CPU_SUBTYPE_X86_ALL;
|
||||
break;
|
||||
|
||||
case PLCRASH__ARCHITECTURE__X86_64:
|
||||
processorType = CPU_TYPE_X86_64;
|
||||
processorSubtype = CPU_SUBTYPE_X86_64_ALL;
|
||||
break;
|
||||
|
||||
case PLCRASH__ARCHITECTURE__PPC:
|
||||
processorType = CPU_TYPE_POWERPC;
|
||||
processorSubtype = CPU_SUBTYPE_POWERPC_ALL;
|
||||
break;
|
||||
|
||||
case PLCRASH__ARCHITECTURE__PPC64:
|
||||
processorType = CPU_TYPE_POWERPC64;
|
||||
processorSubtype = CPU_SUBTYPE_POWERPC_ALL;
|
||||
break;
|
||||
|
||||
case PLCRASH__ARCHITECTURE__ARMV6:
|
||||
processorType = CPU_TYPE_ARM;
|
||||
processorSubtype = CPU_SUBTYPE_ARM_V6;
|
||||
break;
|
||||
|
||||
case PLCRASH__ARCHITECTURE__ARMV7:
|
||||
processorType = CPU_TYPE_ARM;
|
||||
processorSubtype = CPU_SUBTYPE_ARM_V7;
|
||||
break;
|
||||
|
||||
default:
|
||||
populate_nserror(outError, PLCrashReporterErrorCrashReportInvalid,
|
||||
NSLocalizedString(@"Crash report has an unknown architecture",
|
||||
@"Unknown architecture in crash report"));
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [[[PLCrashReportProcessorInfo alloc] initWithTypeEncoding: PLCrashReportProcessorTypeEncodingMach
|
||||
type: processorType
|
||||
subtype: processorSubtype] autorelease];
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract machine information from the crash log. Returns nil on error.
|
||||
*/
|
||||
|
@ -778,7 +851,6 @@ error:
|
|||
* and nothing is modified.
|
||||
* @param code The error code corresponding to this error.
|
||||
* @param description A localized error description.
|
||||
* @param cause The underlying cause, if any. May be nil.
|
||||
*/
|
||||
static void populate_nserror (NSError **error, PLCrashReporterError code, NSString *description) {
|
||||
NSDictionary *userInfo;
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include "PLCrashMacros.h"
|
||||
@class PLCrashReportProcessorInfo;
|
||||
|
||||
/**
|
||||
* @ingroup constants
|
||||
|
@ -61,7 +63,7 @@ typedef enum {
|
|||
*
|
||||
* Indicates the architecture under which a Crash Log was generated.
|
||||
*
|
||||
* @deprecated The architecture value has been deprecated in v1.1 and later crash reports. All new reports
|
||||
* @note The architecture value has been deprecated in v1.1 and later crash reports. All new reports
|
||||
* will make use of the new PLCrashReportProcessorInfo CPU type encodings.
|
||||
*
|
||||
* @internal
|
||||
|
@ -83,7 +85,7 @@ typedef enum {
|
|||
* values.
|
||||
* @sa PLCrashReportArchitectureARMv6
|
||||
*/
|
||||
PLCrashReportArchitectureARM = PLCrashReportArchitectureARMv6,
|
||||
PLCrashReportArchitectureARM PLCR_DEPRECATED = PLCrashReportArchitectureARMv6,
|
||||
|
||||
/** PPC */
|
||||
PLCrashReportArchitecturePPC = 3,
|
||||
|
@ -100,7 +102,9 @@ typedef enum {
|
|||
#pragma clang diagnostic pop
|
||||
|
||||
extern PLCrashReportOperatingSystem PLCrashReportHostOperatingSystem;
|
||||
extern PLCrashReportArchitecture PLCrashReportHostArchitecture;
|
||||
PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH();
|
||||
extern PLCrashReportArchitecture PLCrashReportHostArchitecture PLCR_EXTERNAL_DEPRECATED;
|
||||
PLCR_EXTERNAL_DEPRECATED_NOWARN_PUSH();
|
||||
|
||||
@interface PLCrashReportSystemInfo : NSObject {
|
||||
@private
|
||||
|
@ -118,17 +122,27 @@ extern PLCrashReportArchitecture PLCrashReportHostArchitecture;
|
|||
|
||||
/** Date crash report was generated. May be nil if the date is unknown. */
|
||||
NSDate *_timestamp;
|
||||
|
||||
/** Processor information. */
|
||||
PLCrashReportProcessorInfo *_processorInfo;
|
||||
}
|
||||
|
||||
- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem
|
||||
operatingSystemVersion: (NSString *) operatingSystemVersion
|
||||
architecture: (PLCrashReportArchitecture) architecture
|
||||
timestamp: (NSDate *) timestamp;
|
||||
timestamp: (NSDate *) timestamp PLCR_DEPRECATED;
|
||||
|
||||
- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem
|
||||
operatingSystemVersion: (NSString *) operatingSystemVersion
|
||||
operatingSystemBuild: (NSString *) operatingSystemBuild
|
||||
architecture: (PLCrashReportArchitecture) architecture
|
||||
timestamp: (NSDate *) timestamp PLCR_DEPRECATED;
|
||||
|
||||
- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem
|
||||
operatingSystemVersion: (NSString *) operatingSystemVersion
|
||||
operatingSystemBuild: (NSString *) operatingSystemBuild
|
||||
architecture: (PLCrashReportArchitecture) architecture
|
||||
processorInfo: (PLCrashReportProcessorInfo *) processorInfo
|
||||
timestamp: (NSDate *) timestamp;
|
||||
|
||||
/** The operating system. */
|
||||
|
@ -145,10 +159,13 @@ extern PLCrashReportArchitecture PLCrashReportHostArchitecture;
|
|||
/** Architecture. @deprecated The architecture value has been deprecated in v1.1 and later crash reports. All new reports
|
||||
* include the CPU type as part of the crash report's machine info structure, using the PLCrashReportProcessorInfo
|
||||
* extensible encoding. */
|
||||
@property(nonatomic, readonly) PLCrashReportArchitecture architecture;
|
||||
#pragma clang diagnostic pop
|
||||
@property(nonatomic, readonly) PLCrashReportArchitecture architecture PLCR_DEPRECATED;
|
||||
|
||||
/** Date and time that the crash report was generated. This may be unavailable, and this property will be nil. */
|
||||
@property(nonatomic, readonly) NSDate *timestamp;
|
||||
|
||||
/** The processor type. For v1.2 reports and later, this is an alias to the machine info's processorInfo.
|
||||
* For earlier reports, this will be synthesized from the deprecated architecture property. */
|
||||
@property(nonatomic, readonly) PLCrashReportProcessorInfo *processorInfo;
|
||||
|
||||
@end
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
*/
|
||||
|
||||
#import "PLCrashReportSystemInfo.h"
|
||||
#import "PLCrashReportProcessorInfo.h"
|
||||
|
||||
/**
|
||||
* @ingroup constants
|
||||
|
@ -97,6 +98,7 @@ PLCrashReportArchitecture PLCrashReportHostArchitecture =
|
|||
operatingSystemVersion: operatingSystemVersion
|
||||
operatingSystemBuild: nil
|
||||
architecture: architecture
|
||||
processorInfo: nil
|
||||
timestamp: timestamp];
|
||||
}
|
||||
|
||||
|
@ -114,6 +116,31 @@ PLCrashReportArchitecture PLCrashReportHostArchitecture =
|
|||
operatingSystemBuild: (NSString *) operatingSystemBuild
|
||||
architecture: (PLCrashReportArchitecture) architecture
|
||||
timestamp: (NSDate *) timestamp
|
||||
{
|
||||
return [self initWithOperatingSystem: operatingSystem
|
||||
operatingSystemVersion: operatingSystemVersion
|
||||
operatingSystemBuild: operatingSystemBuild
|
||||
architecture: architecture
|
||||
processorInfo: nil
|
||||
timestamp: timestamp];
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the system info data object.
|
||||
*
|
||||
* @param operatingSystem Operating System
|
||||
* @param operatingSystemVersion OS version
|
||||
* @param operatingSystemBuild OS build (may be nil).
|
||||
* @param architecture Architecture
|
||||
* @param processorInfo The processor info
|
||||
* @param timestamp Timestamp (may be nil).
|
||||
*/
|
||||
- (id) initWithOperatingSystem: (PLCrashReportOperatingSystem) operatingSystem
|
||||
operatingSystemVersion: (NSString *) operatingSystemVersion
|
||||
operatingSystemBuild: (NSString *) operatingSystemBuild
|
||||
architecture: (PLCrashReportArchitecture) architecture
|
||||
processorInfo: (PLCrashReportProcessorInfo *) processorInfo
|
||||
timestamp: (NSDate *) timestamp
|
||||
{
|
||||
if ((self = [super init]) == nil)
|
||||
return nil;
|
||||
|
@ -122,6 +149,7 @@ PLCrashReportArchitecture PLCrashReportHostArchitecture =
|
|||
_osVersion = [operatingSystemVersion retain];
|
||||
_osBuild = [operatingSystemBuild retain];
|
||||
_architecture = architecture;
|
||||
_processorInfo = [processorInfo retain];
|
||||
_timestamp = [timestamp retain];
|
||||
|
||||
return self;
|
||||
|
@ -131,6 +159,7 @@ PLCrashReportArchitecture PLCrashReportHostArchitecture =
|
|||
[_osVersion release];
|
||||
[_osBuild release];
|
||||
[_timestamp release];
|
||||
[_processorInfo release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
@ -139,5 +168,6 @@ PLCrashReportArchitecture PLCrashReportHostArchitecture =
|
|||
@synthesize operatingSystemBuild = _osBuild;
|
||||
@synthesize architecture = _architecture;
|
||||
@synthesize timestamp = _timestamp;
|
||||
@synthesize processorInfo = _processorInfo;
|
||||
|
||||
@end
|
||||
|
|
|
@ -159,7 +159,11 @@ static plcrash_error_t plcr_live_report_callback (plcrash_async_thread_state_t *
|
|||
STAssertNotNil(crashLog.systemInfo.operatingSystemBuild, @"OS build is nil");
|
||||
STAssertNotNil(crashLog.systemInfo.timestamp, @"Timestamp is nil");
|
||||
STAssertEquals(crashLog.systemInfo.operatingSystem, PLCrashReportHostOperatingSystem, @"Operating system incorrect");
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated"
|
||||
STAssertEquals(crashLog.systemInfo.architecture, PLCrashReportHostArchitecture, @"Architecture incorrect");
|
||||
#pragma clang diagnostic pop
|
||||
STAssertNotNil(crashLog.systemInfo.processorInfo, @"Processor info is nil");
|
||||
|
||||
/* Machine info */
|
||||
const NXArchInfo *archInfo = NXGetLocalArchInfo();
|
||||
|
|
|
@ -133,32 +133,46 @@ static NSInteger binaryImageSort(id binary1, id binary2, void *context);
|
|||
break;
|
||||
}
|
||||
|
||||
/* If we were unable to determine the code type, fall back on the legacy architecture value. */
|
||||
if (codeType == nil) {
|
||||
switch (report.systemInfo.architecture) {
|
||||
case PLCrashReportArchitectureARMv6:
|
||||
case PLCrashReportArchitectureARMv7:
|
||||
/* If we were unable to determine the code type, fall back on the processor info's value. */
|
||||
if (codeType == nil && report.systemInfo.processorInfo.typeEncoding == PLCrashReportProcessorTypeEncodingMach) {
|
||||
switch (report.systemInfo.processorInfo.type) {
|
||||
case CPU_TYPE_ARM:
|
||||
codeType = @"ARM";
|
||||
lp64 = false;
|
||||
break;
|
||||
case PLCrashReportArchitectureX86_32:
|
||||
|
||||
case CPU_TYPE_ARM64:
|
||||
codeType = @"ARM-64";
|
||||
lp64 = true;
|
||||
break;
|
||||
|
||||
case CPU_TYPE_X86:
|
||||
codeType = @"X86";
|
||||
lp64 = false;
|
||||
break;
|
||||
case PLCrashReportArchitectureX86_64:
|
||||
|
||||
case CPU_TYPE_X86_64:
|
||||
codeType = @"X86-64";
|
||||
lp64 = true;
|
||||
break;
|
||||
case PLCrashReportArchitecturePPC:
|
||||
|
||||
case CPU_TYPE_POWERPC:
|
||||
codeType = @"PPC";
|
||||
lp64 = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
codeType = [NSString stringWithFormat: @"Unknown (%d)", report.systemInfo.architecture];
|
||||
codeType = [NSString stringWithFormat: @"Unknown (%llu)", report.systemInfo.processorInfo.type];
|
||||
lp64 = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we still haven't determined the code type, we're totally clueless. */
|
||||
if (codeType == nil) {
|
||||
codeType = @"Unknown";
|
||||
lp64 = true;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#import <mach/mach.h>
|
||||
|
||||
#import "PLCrashReporterConfig.h"
|
||||
#import "PLCrashMacros.h"
|
||||
|
||||
@class PLCrashMachExceptionServer;
|
||||
@class PLCrashMachExceptionPortSet;
|
||||
|
@ -44,8 +45,7 @@
|
|||
* @param uap The crash's threads context.
|
||||
* @param context The API client's supplied context value.
|
||||
*
|
||||
* @sa async_satefy
|
||||
* @ref async_safety
|
||||
* @sa The @ref async_safety documentation.
|
||||
* @sa PLCrashReporter::setPostCrashCallbacks:
|
||||
*/
|
||||
typedef void (*PLCrashReporterPostCrashSignalCallback)(siginfo_t *info, ucontext_t *uap, void *context);
|
||||
|
@ -56,8 +56,7 @@ typedef void (*PLCrashReporterPostCrashSignalCallback)(siginfo_t *info, ucontext
|
|||
* This structure contains callbacks supported by PLCrashReporter to allow the host application to perform
|
||||
* additional tasks prior to program termination after a crash has occured.
|
||||
*
|
||||
* @sa async_satefy
|
||||
* @ref async_safety
|
||||
* @sa The @ref async_safety documentation.
|
||||
*/
|
||||
typedef struct PLCrashReporterCallbacks {
|
||||
/** The version number of this structure. If not one of the defined version numbers for this type, the behavior
|
||||
|
@ -112,7 +111,7 @@ typedef struct PLCrashReporterCallbacks {
|
|||
NSString *_crashReportDirectory;
|
||||
}
|
||||
|
||||
+ (PLCrashReporter *) sharedReporter;
|
||||
+ (PLCrashReporter *) sharedReporter PLCR_DEPRECATED;
|
||||
|
||||
- (instancetype) initWithConfiguration: (PLCrashReporterConfig *) config;
|
||||
|
||||
|
|
|
@ -810,7 +810,7 @@ cleanup:
|
|||
* @note This method must be called prior to PLCrashReporter::enableCrashReporter or
|
||||
* PLCrashReporter::enableCrashReporterAndReturnError:
|
||||
*
|
||||
* @sa @ref async_safety
|
||||
* @sa The @ref async_safety documentation.
|
||||
*/
|
||||
- (void) setCrashCallbacks: (PLCrashReporterCallbacks *) callbacks {
|
||||
/* Check for programmer error; this should not be called after the signal handler is enabled as to ensure that
|
||||
|
@ -914,7 +914,7 @@ cleanup:
|
|||
/**
|
||||
* Create, register, and return a Mach exception server.
|
||||
*
|
||||
* @param previousPortSet[out] The previously registered Mach exception ports.
|
||||
* @param[out] previousPortSet The previously registered Mach exception ports.
|
||||
* @param context The context to be provided to the callback.
|
||||
* @param outError A pointer to an NSError object variable. If an error occurs, this pointer
|
||||
* will contain an error in the PLCrashReporterErrorDomain indicating why the Crash Reporter
|
||||
|
|
|
@ -39,8 +39,11 @@
|
|||
@implementation PLCrashReporterTests
|
||||
|
||||
- (void) testSingleton {
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated"
|
||||
STAssertNotNil([PLCrashReporter sharedReporter], @"Returned nil singleton instance");
|
||||
STAssertTrue([PLCrashReporter sharedReporter] == [PLCrashReporter sharedReporter], @"Crash reporter did not return singleton instance");
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -53,13 +56,14 @@
|
|||
|
||||
/* Spawn a thread and generate a report for it */
|
||||
plcrash_test_thread_spawn(&thr);
|
||||
reportData = [[PLCrashReporter sharedReporter] generateLiveReportWithThread: pthread_mach_thread_np(thr.thread)
|
||||
error: &error];
|
||||
PLCrashReporter *reporter = [[[PLCrashReporter alloc] initWithConfiguration: [PLCrashReporterConfig defaultConfiguration]] autorelease];
|
||||
reportData = [reporter generateLiveReportWithThread: pthread_mach_thread_np(thr.thread)
|
||||
error: &error];
|
||||
plcrash_test_thread_stop(&thr);
|
||||
STAssertNotNil(reportData, @"Failed to generate live report: %@", error);
|
||||
|
||||
/* Try parsing the result */
|
||||
PLCrashReport *report = [[PLCrashReport alloc] initWithData: reportData error: &error];
|
||||
PLCrashReport *report = [[[PLCrashReport alloc] initWithData: reportData error: &error] autorelease];
|
||||
STAssertNotNil(report, @"Could not parse geneated live report: %@", error);
|
||||
|
||||
/* Sanity check the signal info */
|
||||
|
@ -72,10 +76,11 @@
|
|||
*/
|
||||
- (void) testGenerateLiveReport {
|
||||
NSError *error;
|
||||
NSData *reportData = [[PLCrashReporter sharedReporter] generateLiveReportAndReturnError: &error];
|
||||
PLCrashReporter *reporter = [[[PLCrashReporter alloc] initWithConfiguration: [PLCrashReporterConfig defaultConfiguration]] autorelease];
|
||||
NSData *reportData = [reporter generateLiveReportAndReturnError: &error];
|
||||
STAssertNotNil(reportData, @"Failed to generate live report: %@", error);
|
||||
|
||||
PLCrashReport *report = [[PLCrashReport alloc] initWithData: reportData error: &error];
|
||||
PLCrashReport *report = [[[PLCrashReport alloc] initWithData: reportData error: &error] autorelease];
|
||||
STAssertNotNil(report, @"Could not parse geneated live report: %@", error);
|
||||
|
||||
STAssertEqualStrings([[report signalInfo] name], @"SIGTRAP", @"Incorrect signal name");
|
||||
|
|
|
@ -104,11 +104,11 @@ static struct {
|
|||
* to support executing process-wide POSIX signal handlers that were previously registered before being replaced by
|
||||
* PLCrashSignalHandler::registerHandlerForSignal:.
|
||||
*/
|
||||
static bool previous_action_callback (int signo, siginfo_t *info, ucontext_t *uap, void *context, PLCrashSignalHandlerCallback *next) {
|
||||
static bool previous_action_callback (int signo, siginfo_t *info, ucontext_t *uap, void *context, PLCrashSignalHandlerCallback *nextHandler) {
|
||||
bool handled = false;
|
||||
|
||||
/* Let any additional handler execute */
|
||||
if (PLCrashSignalHandlerForward(next, signo, info, uap))
|
||||
if (PLCrashSignalHandlerForward(nextHandler, signo, info, uap))
|
||||
return true;
|
||||
|
||||
shared_handler_context.previous_actions.set_reading(true); {
|
||||
|
@ -125,23 +125,20 @@ static bool previous_action_callback (int signo, siginfo_t *info, ucontext_t *ua
|
|||
next->value().action.sa_sigaction(signo, info, (void *) uap);
|
||||
handled = true;
|
||||
} else {
|
||||
switch ((uintptr_t) (next->value().action.sa_handler)) {
|
||||
case ((uintptr_t) SIG_IGN):
|
||||
/* Ignored */
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case ((uintptr_t) SIG_DFL):
|
||||
/* Default handler should be run, be we have no mechanism to pass through to
|
||||
* the default handler; mark the signal as unhandled. */
|
||||
handled = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Handler registered, execute it */
|
||||
next->value().action.sa_handler(signo);
|
||||
handled = true;
|
||||
break;
|
||||
void (*next_handler)(int) = next->value().action.sa_handler;
|
||||
if (next_handler == SIG_IGN) {
|
||||
/* Ignored */
|
||||
handled = true;
|
||||
|
||||
} else if (next_handler == SIG_DFL) {
|
||||
/* Default handler should be run, be we have no mechanism to pass through to
|
||||
* the default handler; mark the signal as unhandled. */
|
||||
handled = false;
|
||||
|
||||
} else {
|
||||
/* Handler registered, execute it */
|
||||
next_handler(signo);
|
||||
handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
/*
|
||||
* Print command line usage.
|
||||
*/
|
||||
void print_usage () {
|
||||
static void print_usage () {
|
||||
fprintf(stderr, "Usage: plcrashutil <command> <options>\n"
|
||||
"Commands:\n"
|
||||
" convert --format=<format> <file>\n"
|
||||
|
@ -49,7 +49,7 @@ void print_usage () {
|
|||
/*
|
||||
* Run a conversion.
|
||||
*/
|
||||
int convert_command (int argc, char *argv[]) {
|
||||
static int convert_command (int argc, char *argv[]) {
|
||||
const char *format = "iphone";
|
||||
const char *input_file;
|
||||
FILE *output = stdout;
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>QLGenerator</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>org.plcrashreporter.crash</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>coop.plausible.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>CFPlugInDynamicRegisterFunction</key>
|
||||
<string></string>
|
||||
<key>CFPlugInDynamicRegistration</key>
|
||||
<string>NO</string>
|
||||
<key>CFPlugInFactories</key>
|
||||
<dict>
|
||||
<key>152FFDC1-A31F-47EA-9076-0CCAFF6359A1</key>
|
||||
<string>QuickLookGeneratorPluginFactory</string>
|
||||
</dict>
|
||||
<key>CFPlugInTypes</key>
|
||||
<dict>
|
||||
<key>5E2D9680-5022-40FA-B806-43349622E5B9</key>
|
||||
<array>
|
||||
<string>152FFDC1-A31F-47EA-9076-0CCAFF6359A1</string>
|
||||
</array>
|
||||
</dict>
|
||||
<key>CFPlugInUnloadFunction</key>
|
||||
<string></string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2015 Plausible Labs Cooperative, Inc. All rights reserved.</string>
|
||||
<key>QLNeedsToBeRunInMainThread</key>
|
||||
<false/>
|
||||
<key>QLPreviewHeight</key>
|
||||
<real>600</real>
|
||||
<key>QLPreviewWidth</key>
|
||||
<real>800</real>
|
||||
<key>QLSupportsConcurrentRequests</key>
|
||||
<false/>
|
||||
<key>QLThumbnailMinimumSize</key>
|
||||
<real>17</real>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,6 @@
|
|||
//
|
||||
// Prefix header
|
||||
//
|
||||
// The contents of this file are implicitly included at the beginning of every source file.
|
||||
//
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <QuickLook/QuickLook.h>
|
||||
#import <CrashReporter/CrashReporter.h>
|
||||
|
||||
OSStatus GeneratePreviewForURL (void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options);
|
||||
void CancelPreviewGeneration (void *thisInterface, QLPreviewRequestRef preview);
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Generate a preview for file
|
||||
|
||||
This function's job is to create preview for designated file
|
||||
----------------------------------------------------------------------------- */
|
||||
|
||||
OSStatus GeneratePreviewForURL (void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSData *data = [NSData dataWithContentsOfURL: (__bridge NSURL *)url];
|
||||
if (!data)
|
||||
return noErr;
|
||||
|
||||
PLCrashReport *report = [[PLCrashReport alloc] initWithData: data error: NULL];
|
||||
if (!report)
|
||||
return noErr;
|
||||
|
||||
NSString *text = [PLCrashReportTextFormatter stringValueForCrashReport: report
|
||||
withTextFormat: PLCrashReportTextFormatiOS];
|
||||
NSData *utf8Data = [text dataUsingEncoding: NSUTF8StringEncoding];
|
||||
QLPreviewRequestSetDataRepresentation(preview, (__bridge CFDataRef)utf8Data, kUTTypePlainText, NULL);
|
||||
}
|
||||
return noErr;
|
||||
}
|
||||
|
||||
void CancelPreviewGeneration (void *thisInterface, QLPreviewRequestRef preview)
|
||||
{
|
||||
// Implement only if supported
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <QuickLook/QuickLook.h>
|
||||
|
||||
OSStatus GenerateThumbnailForURL (void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize);
|
||||
void CancelThumbnailGeneration (void *thisInterface, QLThumbnailRequestRef thumbnail);
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Generate a thumbnail for file
|
||||
|
||||
This function's job is to create thumbnail for designated file as fast as possible
|
||||
----------------------------------------------------------------------------- */
|
||||
|
||||
OSStatus GenerateThumbnailForURL (void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize)
|
||||
{
|
||||
// To complete your generator please implement the function GenerateThumbnailForURL in GenerateThumbnailForURL.c
|
||||
return noErr;
|
||||
}
|
||||
|
||||
void CancelThumbnailGeneration (void *thisInterface, QLThumbnailRequestRef thumbnail)
|
||||
{
|
||||
// Implement only if supported
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
/* Localized versions of Info.plist keys */
|
||||
|
|
@ -0,0 +1,218 @@
|
|||
//==============================================================================
|
||||
//
|
||||
// DO NO MODIFY THE CONTENT OF THIS FILE
|
||||
//
|
||||
// This file contains the generic CFPlug-in code necessary for your generator
|
||||
// To complete your generator implement the function in GenerateThumbnailForURL/GeneratePreviewForURL.c
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <CoreFoundation/CFPlugInCOM.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <QuickLook/QuickLook.h>
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// constants
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// Don't modify this line
|
||||
#define PLUGIN_ID "152FFDC1-A31F-47EA-9076-0CCAFF6359A1"
|
||||
|
||||
//
|
||||
// Below is the generic glue code for all plug-ins.
|
||||
//
|
||||
// You should not have to modify this code aside from changing
|
||||
// names if you decide to change the names defined in the Info.plist
|
||||
//
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// typedefs
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// The thumbnail generation function to be implemented in GenerateThumbnailForURL.c
|
||||
OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize);
|
||||
void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail);
|
||||
|
||||
// The preview generation function to be implemented in GeneratePreviewForURL.c
|
||||
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options);
|
||||
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview);
|
||||
|
||||
// The layout for an instance of QuickLookGeneratorPlugIn
|
||||
typedef struct __QuickLookGeneratorPluginType
|
||||
{
|
||||
void *conduitInterface;
|
||||
CFUUIDRef factoryID;
|
||||
UInt32 refCount;
|
||||
} QuickLookGeneratorPluginType;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// prototypes
|
||||
// -----------------------------------------------------------------------------
|
||||
// Forward declaration for the IUnknown implementation.
|
||||
//
|
||||
|
||||
QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID);
|
||||
void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance);
|
||||
HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv);
|
||||
void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID);
|
||||
ULONG QuickLookGeneratorPluginAddRef(void *thisInstance);
|
||||
ULONG QuickLookGeneratorPluginRelease(void *thisInstance);
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// myInterfaceFtbl definition
|
||||
// -----------------------------------------------------------------------------
|
||||
// The QLGeneratorInterfaceStruct function table.
|
||||
//
|
||||
static QLGeneratorInterfaceStruct myInterfaceFtbl = {
|
||||
NULL,
|
||||
QuickLookGeneratorQueryInterface,
|
||||
QuickLookGeneratorPluginAddRef,
|
||||
QuickLookGeneratorPluginRelease,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// AllocQuickLookGeneratorPluginType
|
||||
// -----------------------------------------------------------------------------
|
||||
// Utility function that allocates a new instance.
|
||||
// You can do some initial setup for the generator here if you wish
|
||||
// like allocating globals etc...
|
||||
//
|
||||
QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID)
|
||||
{
|
||||
QuickLookGeneratorPluginType *theNewInstance;
|
||||
|
||||
theNewInstance = (QuickLookGeneratorPluginType *)malloc(sizeof(QuickLookGeneratorPluginType));
|
||||
memset(theNewInstance,0,sizeof(QuickLookGeneratorPluginType));
|
||||
|
||||
/* Point to the function table Malloc enough to store the stuff and copy the filler from myInterfaceFtbl over */
|
||||
theNewInstance->conduitInterface = malloc(sizeof(QLGeneratorInterfaceStruct));
|
||||
memcpy(theNewInstance->conduitInterface,&myInterfaceFtbl,sizeof(QLGeneratorInterfaceStruct));
|
||||
|
||||
/* Retain and keep an open instance refcount for each factory. */
|
||||
theNewInstance->factoryID = CFRetain(inFactoryID);
|
||||
CFPlugInAddInstanceForFactory(inFactoryID);
|
||||
|
||||
/* This function returns the IUnknown interface so set the refCount to one. */
|
||||
theNewInstance->refCount = 1;
|
||||
return theNewInstance;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// DeallocQuickLookGeneratorPluginType
|
||||
// -----------------------------------------------------------------------------
|
||||
// Utility function that deallocates the instance when
|
||||
// the refCount goes to zero.
|
||||
// In the current implementation generator interfaces are never deallocated
|
||||
// but implement this as this might change in the future
|
||||
//
|
||||
void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance)
|
||||
{
|
||||
CFUUIDRef theFactoryID;
|
||||
|
||||
theFactoryID = thisInstance->factoryID;
|
||||
/* Free the conduitInterface table up */
|
||||
free(thisInstance->conduitInterface);
|
||||
|
||||
/* Free the instance structure */
|
||||
free(thisInstance);
|
||||
if (theFactoryID){
|
||||
CFPlugInRemoveInstanceForFactory(theFactoryID);
|
||||
CFRelease(theFactoryID);
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// QuickLookGeneratorQueryInterface
|
||||
// -----------------------------------------------------------------------------
|
||||
// Implementation of the IUnknown QueryInterface function.
|
||||
//
|
||||
HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv)
|
||||
{
|
||||
CFUUIDRef interfaceID;
|
||||
|
||||
interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault,iid);
|
||||
|
||||
if (CFEqual(interfaceID,kQLGeneratorCallbacksInterfaceID)){
|
||||
/* If the Right interface was requested, bump the ref count,
|
||||
* set the ppv parameter equal to the instance, and
|
||||
* return good status.
|
||||
*/
|
||||
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GenerateThumbnailForURL = GenerateThumbnailForURL;
|
||||
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelThumbnailGeneration = CancelThumbnailGeneration;
|
||||
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GeneratePreviewForURL = GeneratePreviewForURL;
|
||||
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelPreviewGeneration = CancelPreviewGeneration;
|
||||
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType*)thisInstance)->conduitInterface)->AddRef(thisInstance);
|
||||
*ppv = thisInstance;
|
||||
CFRelease(interfaceID);
|
||||
return S_OK;
|
||||
}else{
|
||||
/* Requested interface unknown, bail with error. */
|
||||
*ppv = NULL;
|
||||
CFRelease(interfaceID);
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// QuickLookGeneratorPluginAddRef
|
||||
// -----------------------------------------------------------------------------
|
||||
// Implementation of reference counting for this type. Whenever an interface
|
||||
// is requested, bump the refCount for the instance. NOTE: returning the
|
||||
// refcount is a convention but is not required so don't rely on it.
|
||||
//
|
||||
ULONG QuickLookGeneratorPluginAddRef(void *thisInstance)
|
||||
{
|
||||
((QuickLookGeneratorPluginType *)thisInstance )->refCount += 1;
|
||||
return ((QuickLookGeneratorPluginType*) thisInstance)->refCount;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// QuickLookGeneratorPluginRelease
|
||||
// -----------------------------------------------------------------------------
|
||||
// When an interface is released, decrement the refCount.
|
||||
// If the refCount goes to zero, deallocate the instance.
|
||||
//
|
||||
ULONG QuickLookGeneratorPluginRelease(void *thisInstance)
|
||||
{
|
||||
((QuickLookGeneratorPluginType*)thisInstance)->refCount -= 1;
|
||||
if (((QuickLookGeneratorPluginType*)thisInstance)->refCount == 0){
|
||||
DeallocQuickLookGeneratorPluginType((QuickLookGeneratorPluginType*)thisInstance );
|
||||
return 0;
|
||||
}else{
|
||||
return ((QuickLookGeneratorPluginType*) thisInstance )->refCount;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// QuickLookGeneratorPluginFactory
|
||||
// -----------------------------------------------------------------------------
|
||||
void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID)
|
||||
{
|
||||
QuickLookGeneratorPluginType *result;
|
||||
CFUUIDRef uuid;
|
||||
|
||||
/* If correct type is being requested, allocate an
|
||||
* instance of kQLGeneratorTypeID and return the IUnknown interface.
|
||||
*/
|
||||
if (CFEqual(typeID,kQLGeneratorTypeID)){
|
||||
uuid = CFUUIDCreateFromString(kCFAllocatorDefault,CFSTR(PLUGIN_ID));
|
||||
result = AllocQuickLookGeneratorPluginType(uuid);
|
||||
CFRelease(uuid);
|
||||
return result;
|
||||
}
|
||||
/* If the requested type is incorrect, return NULL. */
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -0,0 +1,844 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
D817BBED1AB871E7003B757A /* PLAsyncTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D817BBEC1AB871E7003B757A /* PLAsyncTask.m */; };
|
||||
D817BBF01AB88C32003B757A /* PLCrashWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D817BBEF1AB88C32003B757A /* PLCrashWindowController.m */; };
|
||||
D817BBF41AB89A11003B757A /* PLProgressIndicatorController.m in Sources */ = {isa = PBXBuildFile; fileRef = D817BBF21AB89A11003B757A /* PLProgressIndicatorController.m */; };
|
||||
D817BBF51AB89A11003B757A /* PLProgressIndicatorController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D817BBF31AB89A11003B757A /* PLProgressIndicatorController.xib */; };
|
||||
D817BC551AB8EBF5003B757A /* CrashReporter.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
D817BC581AB8EC06003B757A /* CrashReporter.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
D817BC591AB8EC65003B757A /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; };
|
||||
D817BC5A1AB8ECB4003B757A /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; };
|
||||
D878135E1AB9F31F00508724 /* PLCrashWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = D878135C1AB9F31F00508724 /* PLCrashWindow.xib */; };
|
||||
D891CC1A18D0C9510048AC0F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC1918D0C9510048AC0F /* Cocoa.framework */; };
|
||||
D891CC2418D0C9510048AC0F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D891CC2218D0C9510048AC0F /* InfoPlist.strings */; };
|
||||
D891CC2618D0C9510048AC0F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D891CC2518D0C9510048AC0F /* main.m */; };
|
||||
D891CC2A18D0C9510048AC0F /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = D891CC2818D0C9510048AC0F /* Credits.rtf */; };
|
||||
D891CC2D18D0C9510048AC0F /* PLCrashDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = D891CC2C18D0C9510048AC0F /* PLCrashDocument.m */; };
|
||||
D891CC3518D0C9510048AC0F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D891CC3418D0C9510048AC0F /* Images.xcassets */; };
|
||||
D891CC6418D0CC970048AC0F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D891CC3118D0C9510048AC0F /* MainMenu.xib */; };
|
||||
D891CC6F18D0D0180048AC0F /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC6E18D0D0180048AC0F /* QuickLook.framework */; };
|
||||
D891CC7118D0D0180048AC0F /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC7018D0D0180048AC0F /* ApplicationServices.framework */; };
|
||||
D891CC7318D0D0180048AC0F /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC7218D0D0180048AC0F /* CoreServices.framework */; };
|
||||
D891CC7518D0D0180048AC0F /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC7418D0D0180048AC0F /* CoreFoundation.framework */; };
|
||||
D891CC7B18D0D0180048AC0F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D891CC7918D0D0180048AC0F /* InfoPlist.strings */; };
|
||||
D891CC7D18D0D0180048AC0F /* GenerateThumbnailForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = D891CC7C18D0D0180048AC0F /* GenerateThumbnailForURL.c */; };
|
||||
D891CC7F18D0D0180048AC0F /* GeneratePreviewForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = D891CC7E18D0D0180048AC0F /* GeneratePreviewForURL.m */; };
|
||||
D891CC8118D0D0180048AC0F /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = D891CC8018D0D0180048AC0F /* main.c */; };
|
||||
D891CC8718D0D1D40048AC0F /* CrashReporterQuicklook.qlgenerator in CopyFiles */ = {isa = PBXBuildFile; fileRef = D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
D817BC381AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05E731F30EFA1AAB005EDFB7;
|
||||
remoteInfo = "CrashReporter-MacOSX-Static";
|
||||
};
|
||||
D817BC3A1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 8DC2EF5B0486A6940098B216;
|
||||
remoteInfo = "CrashReporter-MacOSX";
|
||||
};
|
||||
D817BC3C1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 058812B91040582D009128FB;
|
||||
remoteInfo = "CrashReporter-iOS";
|
||||
};
|
||||
D817BC3E1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05CD31520EE936A9000FDE88;
|
||||
remoteInfo = "CrashReporter-iOS-Device";
|
||||
};
|
||||
D817BC401AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05CD31630EE93905000FDE88;
|
||||
remoteInfo = "CrashReporter-iOS-Simulator";
|
||||
};
|
||||
D817BC421AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05E731E30EFA1A3E005EDFB7;
|
||||
remoteInfo = plcrashutil;
|
||||
};
|
||||
D817BC441AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05CD32690EE93DC3000FDE88;
|
||||
remoteInfo = "Tests-MacOSX";
|
||||
};
|
||||
D817BC461AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05CD32A90EE94062000FDE88;
|
||||
remoteInfo = "Tests-iOS-Simulator";
|
||||
};
|
||||
D817BC481AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05CD33240EE94439000FDE88;
|
||||
remoteInfo = "Tests-iOS-Device";
|
||||
};
|
||||
D817BC4A1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 05F40CE70EF7AB80008050CF;
|
||||
remoteInfo = DemoCrash;
|
||||
};
|
||||
D817BC4C1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 052A45CF136353FB00987004;
|
||||
remoteInfo = "DemoCrash-iOS-Device";
|
||||
};
|
||||
D817BC4E1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 052A464F136355FD00987004;
|
||||
remoteInfo = "DemoCrash-iOS-Simulator";
|
||||
};
|
||||
D817BC501AB8EBAB003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 050DE24D0F61B80B00152ED3;
|
||||
remoteInfo = "Fuzz Testing";
|
||||
};
|
||||
D817BC521AB8EBD5003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
|
||||
remoteInfo = "CrashReporter-MacOSX";
|
||||
};
|
||||
D817BC561AB8EBFE003B757A /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
|
||||
remoteInfo = "CrashReporter-MacOSX";
|
||||
};
|
||||
D891CC8818D0D1E10048AC0F /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = D891CC0E18D0C9510048AC0F /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = D891CC6C18D0D0180048AC0F;
|
||||
remoteInfo = CrashReporterQuicklook;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
D891CC6118D0CB950048AC0F /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
D817BC581AB8EC06003B757A /* CrashReporter.framework in CopyFiles */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
D891CC8618D0D1B20048AC0F /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = Contents/Library/QuickLook;
|
||||
dstSubfolderSpec = 1;
|
||||
files = (
|
||||
D891CC8718D0D1D40048AC0F /* CrashReporterQuicklook.qlgenerator in CopyFiles */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
D891CC8B18D0D2520048AC0F /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
D817BC551AB8EBF5003B757A /* CrashReporter.framework in CopyFiles */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
D817BBEB1AB871E7003B757A /* PLAsyncTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAsyncTask.h; sourceTree = "<group>"; };
|
||||
D817BBEC1AB871E7003B757A /* PLAsyncTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAsyncTask.m; sourceTree = "<group>"; };
|
||||
D817BBEE1AB88C32003B757A /* PLCrashWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashWindowController.h; sourceTree = "<group>"; };
|
||||
D817BBEF1AB88C32003B757A /* PLCrashWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLCrashWindowController.m; sourceTree = "<group>"; };
|
||||
D817BBF11AB89A11003B757A /* PLProgressIndicatorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLProgressIndicatorController.h; sourceTree = "<group>"; };
|
||||
D817BBF21AB89A11003B757A /* PLProgressIndicatorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLProgressIndicatorController.m; sourceTree = "<group>"; };
|
||||
D817BBF31AB89A11003B757A /* PLProgressIndicatorController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PLProgressIndicatorController.xib; sourceTree = "<group>"; };
|
||||
D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CrashReporter.xcodeproj; path = ../../CrashReporter.xcodeproj; sourceTree = "<group>"; };
|
||||
D878135F1AB9F89300508724 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||
D87813601AB9F89300508724 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/PLCrashWindow.xib; sourceTree = "<group>"; };
|
||||
D891CC1618D0C9510048AC0F /* CrashViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CrashViewer.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D891CC1918D0C9510048AC0F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
D891CC1C18D0C9510048AC0F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
||||
D891CC1E18D0C9510048AC0F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
D891CC2118D0C9510048AC0F /* CrashViewer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CrashViewer-Info.plist"; sourceTree = "<group>"; };
|
||||
D891CC2318D0C9510048AC0F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
D891CC2518D0C9510048AC0F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
D891CC2718D0C9510048AC0F /* CrashViewer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CrashViewer-Prefix.pch"; sourceTree = "<group>"; };
|
||||
D891CC2918D0C9510048AC0F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
|
||||
D891CC2B18D0C9510048AC0F /* PLCrashDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashDocument.h; sourceTree = "<group>"; };
|
||||
D891CC2C18D0C9510048AC0F /* PLCrashDocument.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PLCrashDocument.m; sourceTree = "<group>"; };
|
||||
D891CC3418D0C9510048AC0F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
|
||||
D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CrashReporterQuicklook.qlgenerator; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D891CC6E18D0D0180048AC0F /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; };
|
||||
D891CC7018D0D0180048AC0F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; };
|
||||
D891CC7218D0D0180048AC0F /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
|
||||
D891CC7418D0D0180048AC0F /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
|
||||
D891CC7818D0D0180048AC0F /* CrashReporterQuicklook-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CrashReporterQuicklook-Info.plist"; sourceTree = "<group>"; };
|
||||
D891CC7A18D0D0180048AC0F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
D891CC7C18D0D0180048AC0F /* GenerateThumbnailForURL.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = GenerateThumbnailForURL.c; sourceTree = "<group>"; };
|
||||
D891CC7E18D0D0180048AC0F /* GeneratePreviewForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GeneratePreviewForURL.m; sourceTree = "<group>"; };
|
||||
D891CC8018D0D0180048AC0F /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
|
||||
D891CC8218D0D0180048AC0F /* CrashReporterQuicklook-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CrashReporterQuicklook-Prefix.pch"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
D891CC1318D0C9510048AC0F /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D891CC1A18D0C9510048AC0F /* Cocoa.framework in Frameworks */,
|
||||
D817BC591AB8EC65003B757A /* CrashReporter.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
D891CC6818D0D0180048AC0F /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D891CC7518D0D0180048AC0F /* CoreFoundation.framework in Frameworks */,
|
||||
D891CC6F18D0D0180048AC0F /* QuickLook.framework in Frameworks */,
|
||||
D891CC7318D0D0180048AC0F /* CoreServices.framework in Frameworks */,
|
||||
D891CC7118D0D0180048AC0F /* ApplicationServices.framework in Frameworks */,
|
||||
D817BC5A1AB8ECB4003B757A /* CrashReporter.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
D817BC261AB8EBAB003B757A /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D817BC391AB8EBAB003B757A /* libCrashReporter-MacOSX-Static.a */,
|
||||
D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */,
|
||||
D817BC3D1AB8EBAB003B757A /* CrashReporter.framework */,
|
||||
D817BC3F1AB8EBAB003B757A /* libCrashReporter-iphoneos.a */,
|
||||
D817BC411AB8EBAB003B757A /* libCrashReporter-iphonesimulator.a */,
|
||||
D817BC431AB8EBAB003B757A /* plcrashutil */,
|
||||
D817BC451AB8EBAB003B757A /* Tests-MacOSX.xctest */,
|
||||
D817BC471AB8EBAB003B757A /* Tests-iOS-Simulator.xctest */,
|
||||
D817BC491AB8EBAB003B757A /* Tests-iOS-Device.xctest */,
|
||||
D817BC4B1AB8EBAB003B757A /* DemoCrash.app */,
|
||||
D817BC4D1AB8EBAB003B757A /* DemoCrash-iOS-Device.app */,
|
||||
D817BC4F1AB8EBAB003B757A /* DemoCrash-iOS-Simulator.app */,
|
||||
D817BC511AB8EBAB003B757A /* Fuzz Testing */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC0D18D0C9510048AC0F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC1F18D0C9510048AC0F /* CrashViewer */,
|
||||
D891CC7618D0D0180048AC0F /* CrashReporterQuicklook */,
|
||||
D891CC1818D0C9510048AC0F /* Frameworks */,
|
||||
D891CC1718D0C9510048AC0F /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
usesTabs = 0;
|
||||
};
|
||||
D891CC1718D0C9510048AC0F /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC1618D0C9510048AC0F /* CrashViewer.app */,
|
||||
D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC1818D0C9510048AC0F /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */,
|
||||
D891CC1918D0C9510048AC0F /* Cocoa.framework */,
|
||||
D891CC6E18D0D0180048AC0F /* QuickLook.framework */,
|
||||
D891CC7018D0D0180048AC0F /* ApplicationServices.framework */,
|
||||
D891CC7218D0D0180048AC0F /* CoreServices.framework */,
|
||||
D891CC7418D0D0180048AC0F /* CoreFoundation.framework */,
|
||||
D891CC1B18D0C9510048AC0F /* Other Frameworks */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC1B18D0C9510048AC0F /* Other Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC1C18D0C9510048AC0F /* AppKit.framework */,
|
||||
D891CC1E18D0C9510048AC0F /* Foundation.framework */,
|
||||
);
|
||||
name = "Other Frameworks";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC1F18D0C9510048AC0F /* CrashViewer */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC3118D0C9510048AC0F /* MainMenu.xib */,
|
||||
D817BBEB1AB871E7003B757A /* PLAsyncTask.h */,
|
||||
D817BBEC1AB871E7003B757A /* PLAsyncTask.m */,
|
||||
D891CC2B18D0C9510048AC0F /* PLCrashDocument.h */,
|
||||
D891CC2C18D0C9510048AC0F /* PLCrashDocument.m */,
|
||||
D878135C1AB9F31F00508724 /* PLCrashWindow.xib */,
|
||||
D817BBEE1AB88C32003B757A /* PLCrashWindowController.h */,
|
||||
D817BBEF1AB88C32003B757A /* PLCrashWindowController.m */,
|
||||
D817BBF11AB89A11003B757A /* PLProgressIndicatorController.h */,
|
||||
D817BBF21AB89A11003B757A /* PLProgressIndicatorController.m */,
|
||||
D817BBF31AB89A11003B757A /* PLProgressIndicatorController.xib */,
|
||||
D891CC3418D0C9510048AC0F /* Images.xcassets */,
|
||||
D891CC2018D0C9510048AC0F /* Supporting Files */,
|
||||
);
|
||||
path = CrashViewer;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC2018D0C9510048AC0F /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC2118D0C9510048AC0F /* CrashViewer-Info.plist */,
|
||||
D891CC2218D0C9510048AC0F /* InfoPlist.strings */,
|
||||
D891CC2518D0C9510048AC0F /* main.m */,
|
||||
D891CC2718D0C9510048AC0F /* CrashViewer-Prefix.pch */,
|
||||
D891CC2818D0C9510048AC0F /* Credits.rtf */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC7618D0D0180048AC0F /* CrashReporterQuicklook */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC7C18D0D0180048AC0F /* GenerateThumbnailForURL.c */,
|
||||
D891CC7E18D0D0180048AC0F /* GeneratePreviewForURL.m */,
|
||||
D891CC8018D0D0180048AC0F /* main.c */,
|
||||
D891CC7718D0D0180048AC0F /* Supporting Files */,
|
||||
);
|
||||
path = CrashReporterQuicklook;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC7718D0D0180048AC0F /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D891CC7818D0D0180048AC0F /* CrashReporterQuicklook-Info.plist */,
|
||||
D891CC7918D0D0180048AC0F /* InfoPlist.strings */,
|
||||
D891CC8218D0D0180048AC0F /* CrashReporterQuicklook-Prefix.pch */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
D891CC6918D0D0180048AC0F /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
D891CC1518D0C9510048AC0F /* CrashViewer */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = D891CC4A18D0C9510048AC0F /* Build configuration list for PBXNativeTarget "CrashViewer" */;
|
||||
buildPhases = (
|
||||
D891CC1218D0C9510048AC0F /* Sources */,
|
||||
D891CC1318D0C9510048AC0F /* Frameworks */,
|
||||
D891CC1418D0C9510048AC0F /* Resources */,
|
||||
D891CC6118D0CB950048AC0F /* CopyFiles */,
|
||||
D891CC8618D0D1B20048AC0F /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
D817BC571AB8EBFE003B757A /* PBXTargetDependency */,
|
||||
D891CC8918D0D1E10048AC0F /* PBXTargetDependency */,
|
||||
);
|
||||
name = CrashViewer;
|
||||
productName = CrashViewer;
|
||||
productReference = D891CC1618D0C9510048AC0F /* CrashViewer.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
D891CC6C18D0D0180048AC0F /* CrashReporterQuicklook */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = D891CC8318D0D0180048AC0F /* Build configuration list for PBXNativeTarget "CrashReporterQuicklook" */;
|
||||
buildPhases = (
|
||||
D891CC6718D0D0180048AC0F /* Sources */,
|
||||
D891CC6818D0D0180048AC0F /* Frameworks */,
|
||||
D891CC6918D0D0180048AC0F /* Headers */,
|
||||
D891CC6A18D0D0180048AC0F /* Resources */,
|
||||
D891CC8B18D0D2520048AC0F /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
D817BC531AB8EBD5003B757A /* PBXTargetDependency */,
|
||||
);
|
||||
name = CrashReporterQuicklook;
|
||||
productName = CrashReporterQuicklook;
|
||||
productReference = D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
D891CC0E18D0C9510048AC0F /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
CLASSPREFIX = PL;
|
||||
LastUpgradeCheck = 0510;
|
||||
ORGANIZATIONNAME = "Plausible Labs Cooperative, Inc.";
|
||||
};
|
||||
buildConfigurationList = D891CC1118D0C9510048AC0F /* Build configuration list for PBXProject "CrashViewer" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = D891CC0D18D0C9510048AC0F;
|
||||
productRefGroup = D891CC1718D0C9510048AC0F /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = D817BC261AB8EBAB003B757A /* Products */;
|
||||
ProjectRef = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
D891CC1518D0C9510048AC0F /* CrashViewer */,
|
||||
D891CC6C18D0D0180048AC0F /* CrashReporterQuicklook */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
D817BC391AB8EBAB003B757A /* libCrashReporter-MacOSX-Static.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = "libCrashReporter-MacOSX-Static.a";
|
||||
remoteRef = D817BC381AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = CrashReporter.framework;
|
||||
remoteRef = D817BC3A1AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC3D1AB8EBAB003B757A /* CrashReporter.framework */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.framework;
|
||||
path = CrashReporter.framework;
|
||||
remoteRef = D817BC3C1AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC3F1AB8EBAB003B757A /* libCrashReporter-iphoneos.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = "libCrashReporter-iphoneos.a";
|
||||
remoteRef = D817BC3E1AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC411AB8EBAB003B757A /* libCrashReporter-iphonesimulator.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = "libCrashReporter-iphonesimulator.a";
|
||||
remoteRef = D817BC401AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC431AB8EBAB003B757A /* plcrashutil */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = "compiled.mach-o.executable";
|
||||
path = plcrashutil;
|
||||
remoteRef = D817BC421AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC451AB8EBAB003B757A /* Tests-MacOSX.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = "Tests-MacOSX.xctest";
|
||||
remoteRef = D817BC441AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC471AB8EBAB003B757A /* Tests-iOS-Simulator.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = "Tests-iOS-Simulator.xctest";
|
||||
remoteRef = D817BC461AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC491AB8EBAB003B757A /* Tests-iOS-Device.xctest */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.cfbundle;
|
||||
path = "Tests-iOS-Device.xctest";
|
||||
remoteRef = D817BC481AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC4B1AB8EBAB003B757A /* DemoCrash.app */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.application;
|
||||
path = DemoCrash.app;
|
||||
remoteRef = D817BC4A1AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC4D1AB8EBAB003B757A /* DemoCrash-iOS-Device.app */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.application;
|
||||
path = "DemoCrash-iOS-Device.app";
|
||||
remoteRef = D817BC4C1AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC4F1AB8EBAB003B757A /* DemoCrash-iOS-Simulator.app */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = wrapper.application;
|
||||
path = "DemoCrash-iOS-Simulator.app";
|
||||
remoteRef = D817BC4E1AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
D817BC511AB8EBAB003B757A /* Fuzz Testing */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = "compiled.mach-o.executable";
|
||||
path = "Fuzz Testing";
|
||||
remoteRef = D817BC501AB8EBAB003B757A /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
D891CC1418D0C9510048AC0F /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D891CC2418D0C9510048AC0F /* InfoPlist.strings in Resources */,
|
||||
D891CC3518D0C9510048AC0F /* Images.xcassets in Resources */,
|
||||
D891CC2A18D0C9510048AC0F /* Credits.rtf in Resources */,
|
||||
D878135E1AB9F31F00508724 /* PLCrashWindow.xib in Resources */,
|
||||
D817BBF51AB89A11003B757A /* PLProgressIndicatorController.xib in Resources */,
|
||||
D891CC6418D0CC970048AC0F /* MainMenu.xib in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
D891CC6A18D0D0180048AC0F /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D891CC7B18D0D0180048AC0F /* InfoPlist.strings in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
D891CC1218D0C9510048AC0F /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D817BBED1AB871E7003B757A /* PLAsyncTask.m in Sources */,
|
||||
D891CC2D18D0C9510048AC0F /* PLCrashDocument.m in Sources */,
|
||||
D817BBF41AB89A11003B757A /* PLProgressIndicatorController.m in Sources */,
|
||||
D891CC2618D0C9510048AC0F /* main.m in Sources */,
|
||||
D817BBF01AB88C32003B757A /* PLCrashWindowController.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
D891CC6718D0D0180048AC0F /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D891CC7D18D0D0180048AC0F /* GenerateThumbnailForURL.c in Sources */,
|
||||
D891CC7F18D0D0180048AC0F /* GeneratePreviewForURL.m in Sources */,
|
||||
D891CC8118D0D0180048AC0F /* main.c in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
D817BC531AB8EBD5003B757A /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = "CrashReporter-MacOSX";
|
||||
targetProxy = D817BC521AB8EBD5003B757A /* PBXContainerItemProxy */;
|
||||
};
|
||||
D817BC571AB8EBFE003B757A /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = "CrashReporter-MacOSX";
|
||||
targetProxy = D817BC561AB8EBFE003B757A /* PBXContainerItemProxy */;
|
||||
};
|
||||
D891CC8918D0D1E10048AC0F /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = D891CC6C18D0D0180048AC0F /* CrashReporterQuicklook */;
|
||||
targetProxy = D891CC8818D0D1E10048AC0F /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
D878135C1AB9F31F00508724 /* PLCrashWindow.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
D87813601AB9F89300508724 /* en */,
|
||||
);
|
||||
name = PLCrashWindow.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC2218D0C9510048AC0F /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
D891CC2318D0C9510048AC0F /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC2818D0C9510048AC0F /* Credits.rtf */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
D891CC2918D0C9510048AC0F /* en */,
|
||||
);
|
||||
name = Credits.rtf;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC3118D0C9510048AC0F /* MainMenu.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
D878135F1AB9F89300508724 /* en */,
|
||||
);
|
||||
name = MainMenu.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D891CC7918D0D0180048AC0F /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
D891CC7A18D0D0180048AC0F /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
D891CC4818D0C9510048AC0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_ASSIGN_ENUM = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
EFFECTIVE_PLATFORM_NAME = "-MacOSX";
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_SHADOW = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
RUN_CLANG_STATIC_ANALYZER = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
D891CC4918D0C9510048AC0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_ASSIGN_ENUM = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EFFECTIVE_PLATFORM_NAME = "-MacOSX";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_SHADOW = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
RUN_CLANG_STATIC_ANALYZER = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
D891CC4B18D0C9510048AC0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "CrashViewer/CrashViewer-Prefix.pch";
|
||||
INFOPLIST_FILE = "CrashViewer/CrashViewer-Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks/";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
D891CC4C18D0C9510048AC0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "CrashViewer/CrashViewer-Prefix.pch";
|
||||
INFOPLIST_FILE = "CrashViewer/CrashViewer-Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks/";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
D891CC8418D0D0180048AC0F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "CrashReporterQuicklook/CrashReporterQuicklook-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = "CrashReporterQuicklook/CrashReporterQuicklook-Info.plist";
|
||||
INSTALL_PATH = /Library/QuickLook;
|
||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks/";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
WRAPPER_EXTENSION = qlgenerator;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
D891CC8518D0D0180048AC0F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "CrashReporterQuicklook/CrashReporterQuicklook-Prefix.pch";
|
||||
INFOPLIST_FILE = "CrashReporterQuicklook/CrashReporterQuicklook-Info.plist";
|
||||
INSTALL_PATH = /Library/QuickLook;
|
||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks/";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
WRAPPER_EXTENSION = qlgenerator;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
D891CC1118D0C9510048AC0F /* Build configuration list for PBXProject "CrashViewer" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
D891CC4818D0C9510048AC0F /* Debug */,
|
||||
D891CC4918D0C9510048AC0F /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
D891CC4A18D0C9510048AC0F /* Build configuration list for PBXNativeTarget "CrashViewer" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
D891CC4B18D0C9510048AC0F /* Debug */,
|
||||
D891CC4C18D0C9510048AC0F /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
D891CC8318D0D0180048AC0F /* Build configuration list for PBXNativeTarget "CrashReporterQuicklook" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
D891CC8418D0D0180048AC0F /* Debug */,
|
||||
D891CC8518D0D0180048AC0F /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = D891CC0E18D0C9510048AC0F /* Project object */;
|
||||
}
|
|
@ -0,0 +1,115 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>plcrash</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>link_code.png</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>PLCrash</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSTypeIsPackage</key>
|
||||
<integer>0</integer>
|
||||
<key>NSDocumentClass</key>
|
||||
<string>PLCrashDocument</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>crash</string>
|
||||
</array>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Crash Report</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>com.apple.crashreport</string>
|
||||
</array>
|
||||
<key>LSTypeIsPackage</key>
|
||||
<integer>1</integer>
|
||||
<key>NSDocumentClass</key>
|
||||
<string>PLCrashDocument</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>txt</string>
|
||||
</array>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Text File</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>None</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>public.plain-text</string>
|
||||
</array>
|
||||
<key>LSTypeIsPackage</key>
|
||||
<integer>0</integer>
|
||||
<key>NSDocumentClass</key>
|
||||
<string>PLCrashDocument</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>coop.plausible.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.developer-tools</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2015 Plausible Labs Cooperative, Inc. All rights reserved.</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>NSSupportsAutomaticTermination</key>
|
||||
<true/>
|
||||
<key>NSSupportsSuddenTermination</key>
|
||||
<true/>
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.data</string>
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>PLCrashReporter Crash Report</string>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>org.plcrashreporter.crash</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
<array>
|
||||
<string>plcrash</string>
|
||||
</array>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,9 @@
|
|||
//
|
||||
// Prefix header
|
||||
//
|
||||
// The contents of this file are implicitly included at the beginning of every source file.
|
||||
//
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#endif
|
|
@ -0,0 +1,58 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "16x16",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "16x16",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "32x32",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "32x32",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "128x128",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "128x128",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "256x256",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "256x256",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "512x512",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"size" : "512x512",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
|
@ -1,7 +1,8 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* Copyright (c) Xojo, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
|
@ -26,41 +27,25 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "HudView.h"
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface StartupViewController : UIViewController <UIAlertViewDelegate> {
|
||||
IBOutlet UILabel *label;
|
||||
IBOutlet UIView *hudView;
|
||||
IBOutlet HudView *hudBox;
|
||||
IBOutlet UIActivityIndicatorView *loadingIndicator;
|
||||
|
||||
UIAlertView *_alertView;
|
||||
|
||||
@private
|
||||
int _alertType;
|
||||
|
||||
int _serverResult;
|
||||
|
||||
BOOL _memoryCrash;
|
||||
|
||||
BOOL _crashIdenticalCurrentVersion;
|
||||
|
||||
NSString *_crashLogAppVersion;
|
||||
|
||||
NSMutableString *_contentOfProperty;
|
||||
@interface PLAsyncTask : NSObject {
|
||||
NSTask *_task;
|
||||
NSMutableData *_stdinData;
|
||||
NSMutableData *_stdoutData;
|
||||
NSMutableData *_stderrData;
|
||||
NSUInteger _stdinPosition;
|
||||
void (^_completionHandler)(PLAsyncTask *, NSData *, NSData *);
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) UILabel *label;
|
||||
@property (nonatomic, retain) UIView *hudView;
|
||||
@property (nonatomic, retain) HudView *hudBox;
|
||||
@property (nonatomic, retain) UIActivityIndicatorView *loadingIndicator;
|
||||
@property(nonatomic, copy) NSString *launchPath;
|
||||
@property(nonatomic, copy) NSArray *arguments;
|
||||
@property(nonatomic, copy) NSDictionary *environment;
|
||||
@property(nonatomic, copy) NSData *stdinData;
|
||||
@property(nonatomic, readonly) int terminationStatus;
|
||||
@property(nonatomic, readonly) NSTaskTerminationReason terminationReason;
|
||||
|
||||
@property (nonatomic, retain) NSString *_crashLogAppVersion;
|
||||
|
||||
- (void) startCrashData;
|
||||
|
||||
- (void) showHUD:(NSString *)title;
|
||||
- (void) removeHUD;
|
||||
- (void)terminate;
|
||||
- (void)launchWithCompletionHandler:(void(^)(PLAsyncTask *, NSData *, NSData *))handler;
|
||||
|
||||
@end
|
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* Copyright (c) Xojo, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLAsyncTask.h"
|
||||
|
||||
/** A wrapper around NSTask that makes asynchronous operations easier. */
|
||||
@implementation PLAsyncTask
|
||||
@synthesize stdinData = _stdinData;
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]) == nil)
|
||||
return nil;
|
||||
|
||||
_task = [[NSTask alloc] init];
|
||||
_stderrData = [[NSMutableData alloc] init];
|
||||
_stdoutData = [[NSMutableData alloc] init];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) setLaunchPath:(NSString *)launchPath
|
||||
{
|
||||
_task.launchPath = launchPath;
|
||||
}
|
||||
|
||||
- (NSString *) launchPath
|
||||
{
|
||||
return _task.launchPath;
|
||||
}
|
||||
|
||||
- (void) setArguments: (NSArray *)arguments
|
||||
{
|
||||
_task.arguments = arguments;
|
||||
}
|
||||
|
||||
- (NSArray *) arguments
|
||||
{
|
||||
return _task.arguments;
|
||||
}
|
||||
|
||||
- (void) setEnvironment: (NSDictionary *)environment
|
||||
{
|
||||
_task.environment = environment;
|
||||
}
|
||||
|
||||
- (NSDictionary *) environment
|
||||
{
|
||||
return _task.environment;
|
||||
}
|
||||
|
||||
- (int) terminationStatus
|
||||
{
|
||||
return _task.terminationStatus;
|
||||
}
|
||||
|
||||
- (NSTaskTerminationReason) terminationReason
|
||||
{
|
||||
return _task.terminationReason;
|
||||
}
|
||||
|
||||
- (void) terminate
|
||||
{
|
||||
[_task terminate];
|
||||
}
|
||||
|
||||
/**
|
||||
* Launches the task asynchronously, invoking the handler when the task
|
||||
* terminates.
|
||||
*
|
||||
* @param handler The handler to invoke. The parameters sent to the handler
|
||||
* are the task, the data from stdout, and the data from stderr.
|
||||
*/
|
||||
- (void) launchWithCompletionHandler: (void (^)(PLAsyncTask *, NSData *, NSData *))handler
|
||||
{
|
||||
_completionHandler = [handler copy];
|
||||
|
||||
NSPipe *stdoutPipe = [NSPipe pipe];
|
||||
NSFileHandle *stdoutFileHandle = stdoutPipe.fileHandleForReading;
|
||||
stdoutFileHandle.readabilityHandler = ^(NSFileHandle *handle) {
|
||||
[self->_stdoutData appendData:handle.availableData];
|
||||
};
|
||||
_task.standardOutput = stdoutPipe;
|
||||
|
||||
NSPipe *stderrPipe = [NSPipe pipe];
|
||||
NSFileHandle *stderrFileHandle = stderrPipe.fileHandleForReading;
|
||||
stderrFileHandle.readabilityHandler = ^(NSFileHandle *handle) {
|
||||
[self->_stderrData appendData:handle.availableData];
|
||||
};
|
||||
_task.standardError = stderrPipe;
|
||||
|
||||
if (self.stdinData.length) {
|
||||
NSPipe *stdinPipe = [NSPipe pipe];
|
||||
NSFileHandle *stdinFileHandle = stdinPipe.fileHandleForWriting;
|
||||
fcntl(stdinFileHandle.fileDescriptor, F_SETFL, O_NONBLOCK);
|
||||
|
||||
stdinFileHandle.writeabilityHandler = ^(NSFileHandle *handle) {
|
||||
/* -[NSFileHandle write:] raises exceptions, doesn't tell us how
|
||||
* much data was written, and ugly in general. Drop down to the
|
||||
* POSIX level to do this nicer. */
|
||||
ssize_t result = write(handle.fileDescriptor,
|
||||
(const char *)self.stdinData.bytes + self->_stdinPosition,
|
||||
self.stdinData.length - self->_stdinPosition);
|
||||
if (result > 0) {
|
||||
self->_stdinPosition += result;
|
||||
if (self->_stdinPosition == self.stdinData.length) {
|
||||
handle.writeabilityHandler = nil;
|
||||
[handle closeFile];
|
||||
}
|
||||
} else if (errno != EAGAIN && errno != EINTR) {
|
||||
/* Something fatal happened. We don't currently have a way to
|
||||
* report this error back to our caller... */
|
||||
handle.writeabilityHandler = nil;
|
||||
}
|
||||
};
|
||||
|
||||
_task.standardInput = stdinPipe;
|
||||
}
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Warc-retain-cycles"
|
||||
_task.terminationHandler = ^(NSTask *task) {
|
||||
/* We can't set the task's standardOutput/standardError to nil in this
|
||||
* block because it raises an exception. We at least need to nil out the
|
||||
* readability handlers though, because otherwise they'll eat 100% CPU.
|
||||
*/
|
||||
[task.standardOutput fileHandleForReading].readabilityHandler = nil;
|
||||
[task.standardError fileHandleForReading].readabilityHandler = nil;
|
||||
[task.standardInput fileHandleForWriting].writeabilityHandler = nil;
|
||||
task.terminationHandler = nil;
|
||||
|
||||
self->_completionHandler(self, self->_stdoutData, self->_stderrData);
|
||||
self->_completionHandler = nil;
|
||||
|
||||
self->_stdoutData.length = 0;
|
||||
self->_stderrData.length = 0;
|
||||
self->_stdinPosition = 0;
|
||||
};
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
[_task launch];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface PLCrashDocument : NSDocument
|
||||
@property(nonatomic, copy) NSString *reportText;
|
||||
@end
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLCrashDocument.h"
|
||||
#import <CrashReporter/CrashReporter.h>
|
||||
#import "PLAsyncTask.h"
|
||||
#import "PLCrashWindowController.h"
|
||||
|
||||
@interface PLCrashDocument ()
|
||||
@end
|
||||
|
||||
@implementation PLCrashDocument
|
||||
|
||||
- (void)makeWindowControllers
|
||||
{
|
||||
PLCrashWindowController *controller = [[PLCrashWindowController alloc] initWithWindowNibName: @"PLCrashWindow"];
|
||||
controller.shouldCascadeWindows = YES;
|
||||
[self addWindowController: controller];
|
||||
}
|
||||
|
||||
- (BOOL) readFromData: (NSData *)data ofType: (NSString *)typeName error: (__autoreleasing NSError **)outError
|
||||
{
|
||||
if ([typeName isEqual: @"PLCrash"]) {
|
||||
PLCrashReport *report = [[PLCrashReport alloc] initWithData: data error: outError];
|
||||
if (!report)
|
||||
return NO;
|
||||
|
||||
NSString *text = [PLCrashReportTextFormatter stringValueForCrashReport: report
|
||||
withTextFormat: PLCrashReportTextFormatiOS];
|
||||
self.reportText = text;
|
||||
return YES;
|
||||
} else if ([typeName isEqual: @"com.apple.crashreport"] || [typeName isEqual: @"public.plain-text"]) {
|
||||
NSString *text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
|
||||
self.reportText = text;
|
||||
return text != nil;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
|
@ -26,11 +26,8 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
|
||||
@interface HudView : UIView {
|
||||
|
||||
}
|
||||
@interface PLCrashWindowController : NSWindowController
|
||||
|
||||
@end
|
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "PLCrashWindowController.h"
|
||||
#import "PLAsyncTask.h"
|
||||
#import "PLCrashDocument.h"
|
||||
#import "PLProgressIndicatorController.h"
|
||||
|
||||
@interface PLCrashWindowController ()
|
||||
/** The currently executing symbolication task, if any. */
|
||||
@property(nonatomic, retain) PLAsyncTask *symbolicationTask;
|
||||
|
||||
/** The progress wheel displayed in the window. Used on pre-10.10 systems. */
|
||||
@property(nonatomic, retain) NSProgressIndicator *indicator;
|
||||
|
||||
/** The progress wheel displayed in the window. Used on 10.10 and higher. */
|
||||
@property(nonatomic, retain) PLProgressIndicatorController *indicatorController;
|
||||
|
||||
/** The text view displaying the crash log. */
|
||||
@property(nonatomic, assign) IBOutlet NSTextView *textView;
|
||||
|
||||
/** Is the window in the process of closing? */
|
||||
@property(nonatomic) BOOL closing;
|
||||
|
||||
/** The alert being displayed if there's an error symbolicating the log. */
|
||||
@property(nonatomic, retain) NSAlert *alert;
|
||||
|
||||
/** The symbolication error alert's accessory view. */
|
||||
@property(nonatomic, weak) IBOutlet NSView *alertAccessoryView;
|
||||
|
||||
/** The error log on the symbolication error alert's accessory view. */
|
||||
@property(nonatomic, assign) IBOutlet NSTextView *alertTextView;
|
||||
@end
|
||||
|
||||
@implementation PLCrashWindowController
|
||||
|
||||
- (void) windowDidLoad
|
||||
{
|
||||
[super windowDidLoad];
|
||||
|
||||
self.textView.font = [NSFont fontWithName: @"Menlo" size: 12];
|
||||
self.textView.string = [self.document reportText];
|
||||
|
||||
if (self.symbolicationCommand.length) {
|
||||
[self addProgressIndicator];
|
||||
[self startSymbolicatingCrash: [self.document reportText]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) windowWillClose: (NSNotification *)notification
|
||||
{
|
||||
self.closing = YES;
|
||||
if (self.symbolicationTask)
|
||||
[self.symbolicationTask terminate];
|
||||
}
|
||||
|
||||
/** The command to execute to symbolicate a crash log. This may be nil. */
|
||||
- (NSString *) symbolicationCommand
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] stringForKey: @"symbolicationCommand"];
|
||||
}
|
||||
|
||||
/**
|
||||
* Asynchronously executes the user's symbolication command, passing the crash
|
||||
* report as stdin.
|
||||
*/
|
||||
- (void) startSymbolicatingCrash: (NSString *)crashText
|
||||
{
|
||||
PLAsyncTask *symbolicationTaks = [[PLAsyncTask alloc] init];
|
||||
symbolicationTaks.launchPath = @"/bin/sh";
|
||||
symbolicationTaks.arguments = @[@"-c", self.symbolicationCommand];
|
||||
symbolicationTaks.stdinData = [crashText dataUsingEncoding: NSUTF8StringEncoding];
|
||||
|
||||
[symbolicationTaks launchWithCompletionHandler: ^(PLAsyncTask *task, NSData *stdoutData, NSData *stderrData) {
|
||||
/* The data arguments aren't guaranteed to be valid after returning from
|
||||
* this callback, so make our strings immediately. */
|
||||
NSString *stdoutText = [[NSString alloc] initWithData: stdoutData encoding: NSUTF8StringEncoding];
|
||||
NSString *stderrText = [[NSString alloc] initWithData: stderrData encoding: NSUTF8StringEncoding];
|
||||
self.symbolicationTask = nil;
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self removeProgressIndicator];
|
||||
if (self.closing)
|
||||
return;
|
||||
|
||||
if (task.terminationStatus == 0) {
|
||||
self.textView.string = stdoutText;
|
||||
} else if (stderrText.length) {
|
||||
[self displaySymbolicationError: stderrText];
|
||||
} else {
|
||||
[self displaySymbolicationError: stdoutText];
|
||||
}
|
||||
});
|
||||
}];
|
||||
self.symbolicationTask = symbolicationTaks;
|
||||
}
|
||||
|
||||
/** Displays the error received while invoking the symbolication command. */
|
||||
- (void) displaySymbolicationError: (NSString *)details
|
||||
{
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
alert.messageText = @"Symbolication failed";
|
||||
alert.informativeText = @"The symbolication command returned a non-zero status code.";
|
||||
alert.accessoryView = self.alertAccessoryView;
|
||||
self.alertTextView.string = details;
|
||||
|
||||
[alert beginSheetModalForWindow: self.window completionHandler: ^(NSModalResponse returnCode) {
|
||||
/* This dialog is informational only and we have no action to take. */
|
||||
}];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an indeterminate progress wheel to the top right of the window to
|
||||
* indicate that symbolication is in progress.
|
||||
*/
|
||||
- (void) addProgressIndicator
|
||||
{
|
||||
if (NSClassFromString(@"NSTitlebarAccessoryViewController")) {
|
||||
PLProgressIndicatorController *indicator = [[PLProgressIndicatorController alloc] init];
|
||||
indicator.layoutAttribute = NSLayoutAttributeRight;
|
||||
[self.window addTitlebarAccessoryViewController: indicator];
|
||||
self.indicatorController = indicator;
|
||||
} else {
|
||||
NSProgressIndicator *indicator = [[NSProgressIndicator alloc] initWithFrame: NSMakeRect(0, 0, 16, 16)];
|
||||
indicator.autoresizingMask = NSViewMinYMargin | NSViewMinXMargin;
|
||||
indicator.style = NSProgressIndicatorSpinningStyle;
|
||||
indicator.controlSize = NSSmallControlSize;
|
||||
|
||||
NSView *themeFrame = [self.window.contentView superview];
|
||||
NSSize frameSize = themeFrame.frame.size;
|
||||
[indicator setFrameOrigin: NSMakePoint(frameSize.width - 18, frameSize.height - 18)];
|
||||
[themeFrame addSubview: indicator];
|
||||
|
||||
[indicator startAnimation: nil];
|
||||
self.indicator = indicator;
|
||||
}
|
||||
}
|
||||
|
||||
/** Removes the progress wheel added by -addProgressIndicator. */
|
||||
- (void) removeProgressIndicator
|
||||
{
|
||||
if (self.indicatorController) {
|
||||
[self.indicatorController removeFromParentViewController];
|
||||
self.indicatorController = nil;
|
||||
} else {
|
||||
[self.indicator removeFromSuperview];
|
||||
self.indicator = nil;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
@interface PLProgressIndicatorController : NSTitlebarAccessoryViewController
|
||||
|
||||
@end
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
|
@ -26,19 +26,18 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface CrashReporterDemoViewController : UIViewController {
|
||||
IBOutlet UIButton *triggerButtonMemoryLeak;
|
||||
IBOutlet UIButton *triggerButtonCrash;
|
||||
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) IBOutlet UIButton *triggerButtonMemoryLeak;
|
||||
@property (nonatomic, retain) IBOutlet UIButton *triggerButtonCrash;
|
||||
|
||||
- (IBAction) triggerMemoryLeak;
|
||||
- (IBAction) triggerCrash;
|
||||
#import "PLProgressIndicatorController.h"
|
||||
|
||||
@interface PLProgressIndicatorController ()
|
||||
@property(nonatomic, weak) IBOutlet NSProgressIndicator *indicator;
|
||||
@end
|
||||
|
||||
/** A titlebar accessory view controller containing a progress wheel. */
|
||||
@implementation PLProgressIndicatorController
|
||||
|
||||
- (void)viewDidAppear {
|
||||
[super viewDidAppear];
|
||||
[self.indicator startAnimation:nil];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7525" systemVersion="14C1510" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7525"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="PLProgressIndicatorController">
|
||||
<connections>
|
||||
<outlet property="indicator" destination="vx5-x7-Qic" id="Mnd-0j-aUZ"/>
|
||||
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customView id="Hz6-mo-xeY">
|
||||
<rect key="frame" x="0.0" y="0.0" width="22" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<progressIndicator horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" maxValue="100" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="vx5-x7-Qic">
|
||||
<rect key="frame" x="2" y="4" width="16" height="16"/>
|
||||
</progressIndicator>
|
||||
</subviews>
|
||||
<point key="canvasLocation" x="147" y="156"/>
|
||||
</customView>
|
||||
</objects>
|
||||
</document>
|
|
@ -0,0 +1,15 @@
|
|||
{\rtf1\ansi\ansicpg1252\cocoartf1344\cocoasubrtf720
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\vieww9600\viewh8400\viewkind0
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
|
||||
|
||||
\f0\b\fs24 \cf0 Engineering:
|
||||
\b0 \
|
||||
Joe Ranieri\
|
||||
\
|
||||
|
||||
\b With special thanks to:
|
||||
\b0 \
|
||||
Xojo, Inc.\
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
/* Localized versions of Info.plist keys */
|
||||
|
|
@ -0,0 +1,268 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7525" systemVersion="14C1510" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7525"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
||||
<items>
|
||||
<menuItem title="CrashViewer" id="1Xt-HY-uBw">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="CrashViewer" systemMenu="apple" id="uQy-DD-JDr">
|
||||
<items>
|
||||
<menuItem title="About CrashViewer" id="5kV-Vb-QxS">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
|
||||
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
|
||||
<connections>
|
||||
<action selector="makeKeyAndOrderFront:" target="LyG-QI-uvF" id="uy1-vh-2pm"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
|
||||
<menuItem title="Services" id="NMo-om-nkz">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
|
||||
<menuItem title="Hide CrashViewer" keyEquivalent="h" id="Olw-nP-bQN">
|
||||
<connections>
|
||||
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Show All" id="Kd2-mp-pUS">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
|
||||
<menuItem title="Quit CrashViewer" keyEquivalent="q" id="4sb-4s-VLi">
|
||||
<connections>
|
||||
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="File" id="dMs-cI-mzQ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="File" id="bib-Uj-vzu">
|
||||
<items>
|
||||
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
|
||||
<connections>
|
||||
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
|
||||
<connections>
|
||||
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Open Recent" id="tXI-mr-wws">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
|
||||
<items>
|
||||
<menuItem title="Clear Menu" id="vNY-rz-j42">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
|
||||
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
|
||||
<connections>
|
||||
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
|
||||
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
|
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
|
||||
<connections>
|
||||
<action selector="printDocument:" target="-1" id="qaZ-4w-aoO"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Edit" id="5QF-Oa-p0T">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
|
||||
<items>
|
||||
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
|
||||
<connections>
|
||||
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
|
||||
<connections>
|
||||
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
|
||||
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
|
||||
<connections>
|
||||
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
|
||||
<connections>
|
||||
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
|
||||
<connections>
|
||||
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
|
||||
<connections>
|
||||
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
|
||||
<menuItem title="Find" id="4EN-yA-p0u">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Find" id="1b7-l0-nxx">
|
||||
<items>
|
||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
|
||||
<connections>
|
||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Window" id="aUF-d1-5bR">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
|
||||
<items>
|
||||
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
|
||||
<connections>
|
||||
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Zoom" id="R4o-n2-Eq4">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
|
||||
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Help" id="wpr-3q-Mcd">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
|
||||
<items>
|
||||
<menuItem title="CrashViewer Help" keyEquivalent="?" id="FKE-Sm-Kum">
|
||||
<connections>
|
||||
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
<window title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="LyG-QI-uvF">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
||||
<rect key="contentRect" x="121" y="123" width="412" height="57"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1366" height="745"/>
|
||||
<view key="contentView" id="gsq-eI-P8p">
|
||||
<rect key="frame" x="0.0" y="0.0" width="412" height="57"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LTi-YW-zcS">
|
||||
<rect key="frame" x="20" y="20" width="161" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Symbolication command:" id="NBF-Oi-duo">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AeE-QJ-ZXk">
|
||||
<rect key="frame" x="187" y="18" width="205" height="22"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="nhw-d9-Xvy">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<binding destination="XBb-ds-Mqg" name="value" keyPath="values.symbolicationCommand" id="9eg-Ib-wS1">
|
||||
<dictionary key="options">
|
||||
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
<point key="canvasLocation" x="637" y="288.5"/>
|
||||
</window>
|
||||
<userDefaultsController id="XBb-ds-Mqg"/>
|
||||
<progressIndicator horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" id="5Mw-7T-3s8">
|
||||
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<point key="canvasLocation" x="697" y="387"/>
|
||||
</progressIndicator>
|
||||
</objects>
|
||||
</document>
|
|
@ -0,0 +1,99 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7525" systemVersion="14C1510" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7525"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="PLCrashWindowController">
|
||||
<connections>
|
||||
<outlet property="alertAccessoryView" destination="Czw-hl-yrv" id="09z-ve-fzq"/>
|
||||
<outlet property="alertTextView" destination="5Jj-qz-VkE" id="6vY-lo-kUT"/>
|
||||
<outlet property="textView" destination="8za-dt-fbM" id="jtV-zC-5UN"/>
|
||||
<outlet property="window" destination="xOd-HO-29H" id="JDu-Pn-CfA"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="xOd-HO-29H" userLabel="Window">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="133" y="235" width="507" height="413"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1366" height="745"/>
|
||||
<value key="minSize" type="size" width="94" height="86"/>
|
||||
<view key="contentView" id="gIp-Ho-8D9">
|
||||
<rect key="frame" x="0.0" y="0.0" width="507" height="413"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8RO-g8-QSL">
|
||||
<rect key="frame" x="0.0" y="0.0" width="507" height="413"/>
|
||||
<clipView key="contentView" id="sKV-kg-0sL">
|
||||
<rect key="frame" x="0.0" y="0.0" width="492" height="413"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textView editable="NO" importsGraphics="NO" findStyle="bar" incrementalSearchingEnabled="YES" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" quoteSubstitution="YES" dashSubstitution="YES" spellingCorrection="YES" smartInsertDelete="YES" id="8za-dt-fbM">
|
||||
<rect key="frame" x="0.0" y="0.0" width="492" height="413"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="507" height="413"/>
|
||||
<size key="maxSize" width="507" height="10000000"/>
|
||||
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="507" height="413"/>
|
||||
<size key="maxSize" width="507" height="10000000"/>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="011-6S-BIH">
|
||||
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="Xz8-5V-nJt">
|
||||
<rect key="frame" x="492" y="0.0" width="15" height="413"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="8RO-g8-QSL" firstAttribute="leading" secondItem="gIp-Ho-8D9" secondAttribute="leading" id="JKi-6H-RTW"/>
|
||||
<constraint firstItem="8RO-g8-QSL" firstAttribute="top" secondItem="gIp-Ho-8D9" secondAttribute="top" id="aYb-3G-2Xn"/>
|
||||
<constraint firstAttribute="trailing" secondItem="8RO-g8-QSL" secondAttribute="trailing" id="pMl-vh-dWZ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="8RO-g8-QSL" secondAttribute="bottom" id="q69-fN-pb1"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="0bl-1N-x8E"/>
|
||||
</connections>
|
||||
</window>
|
||||
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="Czw-hl-yrv">
|
||||
<rect key="frame" x="0.0" y="0.0" width="427" height="204"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<clipView key="contentView" id="GY3-29-1iC">
|
||||
<rect key="frame" x="1" y="1" width="223" height="133"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textView importsGraphics="NO" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" quoteSubstitution="YES" dashSubstitution="YES" spellingCorrection="YES" smartInsertDelete="YES" id="5Jj-qz-VkE">
|
||||
<rect key="frame" x="0.0" y="0.0" width="223" height="202"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="425" height="202"/>
|
||||
<size key="maxSize" width="463" height="10000000"/>
|
||||
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="minSize" width="425" height="202"/>
|
||||
<size key="maxSize" width="463" height="10000000"/>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="nID-es-ae3">
|
||||
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="0HU-Ps-HNG">
|
||||
<rect key="frame" x="224" y="1" width="15" height="133"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<point key="canvasLocation" x="188.5" y="700"/>
|
||||
</scrollView>
|
||||
</objects>
|
||||
</document>
|
15
contrib/php-crashreporter-demo/main.m → Tools/CrashViewer/CrashViewer/main.m
Normal file → Executable file
15
contrib/php-crashreporter-demo/main.m → Tools/CrashViewer/CrashViewer/main.m
Normal file → Executable file
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
* Author: Joe Ranieri <joe@alacatialabs.com>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
|
@ -26,12 +26,9 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
|
||||
int retVal = UIApplicationMain(argc, argv, nil, nil);
|
||||
[pool release];
|
||||
return retVal;
|
||||
int main(int argc, const char * argv[])
|
||||
{
|
||||
return NSApplicationMain(argc, argv);
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
This subtree contains user-contributed code that is not part of the core
|
||||
PLCrashReporter distribution. This software is not provided by or maintained
|
||||
by Plausible Labs, and no support is provided.
|
||||
|
||||
Index:
|
||||
------
|
||||
- php-crashreporter-demo
|
||||
A PHP webapp for accepting crash reports, and corresponding fully localized
|
||||
client integration code.
|
||||
Contributed by: Andreas Linde <mail (at) andreaslinde (dot) de>
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <CrashReporter/CrashReporter.h>
|
||||
#import "StartupViewController.h"
|
||||
|
||||
@class CrashReporterDemoViewController;
|
||||
|
||||
@interface CrashReporterDemoAppDelegate : NSObject <UIApplicationDelegate> {
|
||||
UIApplication *_application;
|
||||
|
||||
IBOutlet UIWindow *window;
|
||||
IBOutlet CrashReporterDemoViewController *viewController;
|
||||
|
||||
IBOutlet StartupViewController *startupViewController;
|
||||
|
||||
BOOL _autoSendCrashData; // true if the user allowed the app to always send the crash data to the developers
|
||||
|
||||
@private
|
||||
|
||||
NSData *_crashData; // holds the last crash report
|
||||
|
||||
time_t _memoryWarningTimestamp; // timestamp when memory warning appeared, we check on terminate if that timestamp is within a reasonable range to avoid false alarms
|
||||
BOOL _memoryWarningReached; // true if memory warning notification is run at least once
|
||||
int _startupFreeMemory; // amount of memory available at startup
|
||||
int _lastStartupFreeMemory; // free memory at the last startup run
|
||||
|
||||
int _crashReportAnalyzerStarted; // flags if the crashlog analyzer is started. since this may crash we need to track it
|
||||
int _shutdownFreeMemory; // amount of memory available at shutdown
|
||||
int _lastShutdownFreeMemory; // free memory at the last shutdown run
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) IBOutlet UIWindow *window;
|
||||
@property (nonatomic, retain) IBOutlet CrashReporterDemoViewController *viewController;
|
||||
@property (nonatomic, retain) IBOutlet StartupViewController *startupViewController;
|
||||
|
||||
- (int) getStartupFreeMemory;
|
||||
- (int) getLastStartupFreeMemory;
|
||||
- (int) getShutdownFreeMemory;
|
||||
- (int) getLastShutdownFreeMemory;
|
||||
|
||||
- (void) finishCrashLog;
|
||||
|
||||
- (BOOL) isAutoSendCrashData;
|
||||
- (void) setAutoSendCrashData:(BOOL)autoSend;
|
||||
- (NSData *)getCrashData;
|
||||
- (BOOL) isAllowContact;
|
||||
- (NSString *) getContactEmail;
|
||||
|
||||
@end
|
||||
|
|
@ -1,321 +0,0 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "CrashReporterDemoAppDelegate.h"
|
||||
#import "CrashReporterDemoViewController.h"
|
||||
#import <mach/mach.h>
|
||||
#import <mach/mach_host.h>
|
||||
|
||||
NSString *kAutoSendCrashDataKey = @"AutoSendCrashDataKey"; // preference key to check if the user allowed the application to send crash data always
|
||||
NSString *kAllowBookmarkAccessKey = @"AllowBookmarkAccessKey"; // grant access to bookmarks
|
||||
NSString *kCrashDataContactAllowKey = @"CrashDataContactAllowKey"; // allow to contact the user via email
|
||||
NSString *kCrashDataContactEmailKey = @"CrashDataContactEmailKey"; // the users email address
|
||||
|
||||
NSString *kCrashReportAnalyzerStarted = @"CrashReportAnalyzerStarted"; // flags if the crashlog analyzer is started. since this may crash we need to track it
|
||||
NSString *kLastRunMemoryWarningReached = @"LastRunMemoryWarningReached"; // is the last crash because of lowmemory warning?
|
||||
NSString *kLastStartupFreeMemory = @"LastStartupFreeMemory"; // the amount of memory available on startup on the run of the app the crash happened
|
||||
NSString *kLastShutdownFreeMemory = @"LastShutdownFreeMemory"; // the amount of memory available on shutdown on the run of the app the crash happened
|
||||
|
||||
@interface CrashReporterDemoAppDelegate ()
|
||||
- (void)handleCrashReport;
|
||||
- (void)sendCrashReport;
|
||||
|
||||
- (void)initViews;
|
||||
- (void) getMemory:(BOOL)startup;
|
||||
@end
|
||||
|
||||
@implementation CrashReporterDemoAppDelegate
|
||||
|
||||
@synthesize window;
|
||||
@synthesize viewController;
|
||||
@synthesize startupViewController;
|
||||
|
||||
- (void) getMemory:(BOOL)startup
|
||||
{
|
||||
mach_port_t host_port;
|
||||
mach_msg_type_number_t host_size;
|
||||
vm_size_t pagesize;
|
||||
|
||||
host_port = mach_host_self();
|
||||
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
|
||||
host_page_size(host_port, &pagesize);
|
||||
|
||||
vm_statistics_data_t vm_stat;
|
||||
|
||||
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
|
||||
NSLog(@"Failed to fetch vm statistics");
|
||||
|
||||
natural_t mem_free = vm_stat.free_count * pagesize;
|
||||
if (startup)
|
||||
_startupFreeMemory = (mem_free / 1024 );
|
||||
else
|
||||
_shutdownFreeMemory = (mem_free / 1024 );
|
||||
}
|
||||
|
||||
|
||||
- (void)applicationDidFinishLaunching:(UIApplication *)application
|
||||
{
|
||||
_application = application;
|
||||
|
||||
[self getMemory:YES];
|
||||
|
||||
_memoryWarningTimestamp = 0;
|
||||
|
||||
NSString *testValue = [[NSUserDefaults standardUserDefaults] stringForKey:kAutoSendCrashDataKey];
|
||||
if (testValue == nil)
|
||||
{
|
||||
_autoSendCrashData = NO;
|
||||
} else {
|
||||
_autoSendCrashData = [[NSUserDefaults standardUserDefaults] boolForKey:kAutoSendCrashDataKey];
|
||||
}
|
||||
|
||||
|
||||
testValue = nil;
|
||||
testValue = [[NSUserDefaults standardUserDefaults] stringForKey:kLastRunMemoryWarningReached];
|
||||
if (testValue == nil)
|
||||
{
|
||||
_memoryWarningReached = NO;
|
||||
} else {
|
||||
_memoryWarningReached = [[NSNumber numberWithInt:[[NSUserDefaults standardUserDefaults] integerForKey:kLastRunMemoryWarningReached]] boolValue];
|
||||
}
|
||||
|
||||
testValue = nil;
|
||||
testValue = [[NSUserDefaults standardUserDefaults] stringForKey:kCrashReportAnalyzerStarted];
|
||||
if (testValue == nil)
|
||||
{
|
||||
_crashReportAnalyzerStarted = 0;
|
||||
} else {
|
||||
_crashReportAnalyzerStarted = [[NSNumber numberWithInt:[[NSUserDefaults standardUserDefaults] integerForKey:kCrashReportAnalyzerStarted]] intValue];
|
||||
}
|
||||
|
||||
testValue = nil;
|
||||
testValue = [[NSUserDefaults standardUserDefaults] stringForKey:kLastStartupFreeMemory];
|
||||
if (testValue == nil)
|
||||
{
|
||||
_lastStartupFreeMemory = 0;
|
||||
} else {
|
||||
_lastStartupFreeMemory = [[NSNumber numberWithInt:[[NSUserDefaults standardUserDefaults] integerForKey:kLastStartupFreeMemory]] intValue];
|
||||
}
|
||||
|
||||
testValue = nil;
|
||||
testValue = [[NSUserDefaults standardUserDefaults] stringForKey:kLastShutdownFreeMemory];
|
||||
if (testValue == nil)
|
||||
{
|
||||
_lastShutdownFreeMemory = 0;
|
||||
} else {
|
||||
_lastShutdownFreeMemory = [[NSNumber numberWithInt:[[NSUserDefaults standardUserDefaults] integerForKey:kLastShutdownFreeMemory]] intValue];
|
||||
}
|
||||
|
||||
_crashData = nil;
|
||||
PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter];
|
||||
NSError *error;
|
||||
|
||||
// Check if we previously crashed
|
||||
if ([crashReporter hasPendingCrashReport])
|
||||
[self handleCrashReport];
|
||||
|
||||
// Enable the Crash Reporter
|
||||
if (![crashReporter enableCrashReporterAndReturnError: &error])
|
||||
NSLog(@"Warning: Could not enable crash reporter: %@", error);
|
||||
|
||||
if (_crashData != nil || ((_memoryWarningReached && _lastStartupFreeMemory != 0 && _lastShutdownFreeMemory < 2000)))
|
||||
{
|
||||
[self sendCrashReport];
|
||||
} else {
|
||||
[self finishCrashLog];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
[viewController release];
|
||||
[window release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
|
||||
{
|
||||
_memoryWarningTimestamp = time(0);
|
||||
}
|
||||
|
||||
|
||||
// Save all changes to the database, then close it.
|
||||
- (void)applicationWillTerminate:(UIApplication *)application
|
||||
{
|
||||
[self getMemory:NO];
|
||||
|
||||
time_t currentTime = time(0);
|
||||
|
||||
// only assume a memory problem caused shutdown if the last memory warning timestamp was less than 3 seconds ago
|
||||
// DEACTIVATED since that didn't proove to be reliable enough
|
||||
/*
|
||||
if (abs(currentTime) - abs(_memoryWarningTimestamp) < 3)
|
||||
{
|
||||
_memoryWarningReached = YES;
|
||||
} else {
|
||||
_memoryWarningReached = NO;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// save current memory
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:_memoryWarningReached] forKey:kLastRunMemoryWarningReached];
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:_startupFreeMemory] forKey:kLastStartupFreeMemory];
|
||||
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:_shutdownFreeMemory] forKey:kLastShutdownFreeMemory];
|
||||
}
|
||||
|
||||
|
||||
- (void)initViews
|
||||
{
|
||||
_memoryWarningReached = NO;
|
||||
|
||||
// Override point for customization after app launch
|
||||
[window addSubview:viewController.view];
|
||||
[window makeKeyAndVisible];
|
||||
}
|
||||
|
||||
|
||||
// this functions sends the crash data to the server
|
||||
- (void)sendCrashReport
|
||||
{
|
||||
[window addSubview:startupViewController.view];
|
||||
[startupViewController startCrashData];
|
||||
}
|
||||
|
||||
|
||||
- (void) finishCrashLog
|
||||
{
|
||||
[startupViewController.view removeFromSuperview];
|
||||
[self initViews];
|
||||
}
|
||||
|
||||
|
||||
- (int) getStartupFreeMemory
|
||||
{
|
||||
return _startupFreeMemory;
|
||||
}
|
||||
|
||||
|
||||
- (int) getLastStartupFreeMemory
|
||||
{
|
||||
return _lastStartupFreeMemory;
|
||||
}
|
||||
|
||||
|
||||
- (int) getShutdownFreeMemory
|
||||
{
|
||||
return _shutdownFreeMemory;
|
||||
}
|
||||
|
||||
|
||||
- (int) getLastShutdownFreeMemory
|
||||
{
|
||||
return _lastShutdownFreeMemory;
|
||||
}
|
||||
|
||||
|
||||
- (BOOL) isAutoSendCrashData
|
||||
{
|
||||
return _autoSendCrashData;
|
||||
}
|
||||
|
||||
|
||||
- (void) setAutoSendCrashData:(BOOL)autoSend
|
||||
{
|
||||
_autoSendCrashData = autoSend;
|
||||
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithBool:autoSend] forKey:kAutoSendCrashDataKey];
|
||||
}
|
||||
|
||||
|
||||
- (NSData *)getCrashData
|
||||
{
|
||||
return _crashData;
|
||||
}
|
||||
|
||||
|
||||
- (BOOL) isAllowContact
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kCrashDataContactAllowKey];
|
||||
}
|
||||
|
||||
|
||||
- (NSString *) getContactEmail
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] stringForKey:kCrashDataContactEmailKey];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark PLCrashReporter
|
||||
|
||||
//
|
||||
// Called to handle a pending crash report.
|
||||
//
|
||||
- (void) handleCrashReport
|
||||
{
|
||||
PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter];
|
||||
NSError *error;
|
||||
|
||||
// Try loading the crash report
|
||||
_crashData = [NSData dataWithData:[crashReporter loadPendingCrashReportDataAndReturnError: &error]];
|
||||
if (_crashData == nil) {
|
||||
NSLog(@"Could not load crash report: %@", error);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
// check if the next call ran successfully the last time
|
||||
if (_crashReportAnalyzerStarted == 0)
|
||||
{
|
||||
// mark the start of the routine
|
||||
_crashReportAnalyzerStarted = 1;
|
||||
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:_crashReportAnalyzerStarted] forKey:kCrashReportAnalyzerStarted];
|
||||
|
||||
// We could send the report from here, but we'll just print out
|
||||
// some debugging info instead
|
||||
PLCrashReport *report = [[[PLCrashReport alloc] initWithData: [_crashData retain] error: &error] autorelease];
|
||||
if (report == nil) {
|
||||
NSLog(@"Could not parse crash report");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
NSLog(@"Crashed on %@", report.systemInfo.timestamp);
|
||||
NSLog(@"Crashed with signal %@ (code %@, address=0x%" PRIx64 ")", report.signalInfo.name,
|
||||
report.signalInfo.code, report.signalInfo.address);
|
||||
}
|
||||
|
||||
// Purge the report
|
||||
finish:
|
||||
// mark the end of the routine
|
||||
_crashReportAnalyzerStarted = 0;
|
||||
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:_crashReportAnalyzerStarted] forKey:kCrashReportAnalyzerStarted];
|
||||
|
||||
[crashReporter purgePendingCrashReport];
|
||||
return;
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "CrashReporterDemoViewController.h"
|
||||
|
||||
@implementation CrashReporterDemoViewController
|
||||
|
||||
@synthesize triggerButtonMemoryLeak;
|
||||
@synthesize triggerButtonCrash;
|
||||
|
||||
|
||||
- (void) allocMoreMemory
|
||||
{
|
||||
NSLog(@"Alloc");
|
||||
NSData *memory1 = [NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Default.png"]];
|
||||
[memory1 retain];
|
||||
NSData *memory2 = [NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Default.png"]];
|
||||
[memory2 retain];
|
||||
}
|
||||
|
||||
|
||||
- (IBAction) triggerMemoryLeak
|
||||
{
|
||||
NSTimer *newTimer;
|
||||
newTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1
|
||||
target: self
|
||||
selector: @selector(allocMoreMemory)
|
||||
userInfo: nil
|
||||
repeats: YES];
|
||||
}
|
||||
|
||||
|
||||
- (IBAction) triggerCrash
|
||||
{
|
||||
/* Trigger a crash */
|
||||
CFRelease(NULL);
|
||||
}
|
||||
|
||||
|
||||
- (void)didReceiveMemoryWarning {
|
||||
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
|
||||
// Release anything that's not essential, such as cached data
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "HudView.h"
|
||||
|
||||
|
||||
@implementation HudView
|
||||
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame {
|
||||
if (self = [super initWithFrame:frame]) {
|
||||
// Initialization code
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
- (void)fillRoundedRect:(CGRect)rect inContext:(CGContextRef)context
|
||||
{
|
||||
float radius = 15.0f;
|
||||
|
||||
CGContextBeginPath(context);
|
||||
CGContextSetGrayFillColor(context, 0.0, 0.75);
|
||||
CGContextMoveToPoint(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect));
|
||||
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMinY(rect) + radius, radius, 3 * M_PI / 2, 0, 0);
|
||||
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMaxY(rect) - radius, radius, 0, M_PI / 2, 0);
|
||||
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMaxY(rect) - radius, radius, M_PI / 2, M_PI, 0);
|
||||
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect) + radius, radius, M_PI, 3 * M_PI / 2, 0);
|
||||
|
||||
CGContextClosePath(context);
|
||||
CGContextFillPath(context);
|
||||
}
|
||||
|
||||
- (void)drawRect:(CGRect)rect
|
||||
{
|
||||
// draw a box with rounded corners to fill the view -
|
||||
CGRect boxRect = self.bounds;
|
||||
CGContextRef ctxt = UIGraphicsGetCurrentContext();
|
||||
boxRect = CGRectInset(boxRect, 1.0f, 1.0f);
|
||||
[self fillRoundedRect:boxRect inContext:ctxt];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
// [_title release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
@end
|
|
@ -1,528 +0,0 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <CrashReporter/CrashReporter.h>
|
||||
#import "StartupViewController.h"
|
||||
#import "CrashReporterDemoAppDelegate.h"
|
||||
|
||||
#define USER_AGENT @"CrashReporterDemo/1.3.0"
|
||||
|
||||
#define CRASH_URL @"http://www.yourdomainname.com/crash.php"
|
||||
|
||||
#define CRASH_TYPE_UNKNOWN 0 // no idea what this bug is about
|
||||
#define CRASH_TYPE_NEW 1 // the bug is new, maybe we need that flag one day
|
||||
#define CRASH_TYPE_FIXED_NEXTRELEASE 2 // the bug is fixed and the bugfix will be available in the next release
|
||||
#define CRASH_TYPE_FIXED_SENDTOAPPLE 3 // the bug is fixed and the new release already has been sent to apple for approval
|
||||
#define CRASH_TYPE_FIXED_AVAILABLE 4 // the bug is fixed and a new version is available, before showing the message check if the user already has updated!
|
||||
|
||||
|
||||
@interface StartupViewController (private)
|
||||
|
||||
- (void) askSendCrash;
|
||||
- (void) sendCrashData;
|
||||
- (void) finishSendCrashData;
|
||||
|
||||
- (void) showCrashStatusMessage:(int)type;
|
||||
|
||||
- (NSMutableURLRequest *)requestWithURL:(NSURL *)theURL;
|
||||
|
||||
- (int) postXML:(NSString*)xml toURL:(NSURL*)url;
|
||||
- (void) parseXMLFileAtURL:(NSString *)url parseError:(NSError **)error;
|
||||
@end
|
||||
|
||||
@implementation StartupViewController
|
||||
|
||||
@synthesize hudView;
|
||||
@synthesize label;
|
||||
@synthesize loadingIndicator;
|
||||
@synthesize hudBox;
|
||||
|
||||
@synthesize _crashLogAppVersion;
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
_memoryCrash = NO;
|
||||
_crashIdenticalCurrentVersion = YES;
|
||||
_crashLogAppVersion = @"";
|
||||
|
||||
_alertType = 10;
|
||||
}
|
||||
|
||||
- (void)didReceiveMemoryWarning {
|
||||
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
|
||||
// Release anything that's not essential, such as cached data
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
- (void)showHUD:(NSString *)title
|
||||
{
|
||||
[self.label setText: title];
|
||||
[self.loadingIndicator startAnimating];
|
||||
[self.hudView setHidden:NO];
|
||||
}
|
||||
|
||||
|
||||
- (void)removeHUD
|
||||
{
|
||||
[self.hudView setHidden:YES];
|
||||
[self.loadingIndicator stopAnimating];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark CrashLog
|
||||
|
||||
- (void) startCrashData
|
||||
{
|
||||
CrashReporterDemoAppDelegate *appDelegate = (CrashReporterDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
|
||||
if (![appDelegate isAutoSendCrashData])
|
||||
{
|
||||
[self askSendCrash];
|
||||
} else {
|
||||
[self sendCrashData];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) askSendCrash
|
||||
{
|
||||
_alertType = 10;
|
||||
_alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"CrashDataFoundTitle", @"Title showing in the alert box when crash report data has been found")
|
||||
message:NSLocalizedString(@"CrashDataFoundDescription", @"Description explaining that crash data has been found and ask the user if the data might be uplaoded to the developers server")
|
||||
delegate:self
|
||||
cancelButtonTitle:NSLocalizedString(@"No", @"")
|
||||
otherButtonTitles:NSLocalizedString(@"Yes", @""),
|
||||
NSLocalizedString(@"Always", @""), nil];
|
||||
|
||||
[_alertView show];
|
||||
[_alertView release];
|
||||
}
|
||||
|
||||
|
||||
- (NSString *) convert
|
||||
{
|
||||
CrashReporterDemoAppDelegate *appDelegate = (CrashReporterDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
|
||||
NSString *xmlString = @"";
|
||||
|
||||
NSError *error;
|
||||
|
||||
// Try loading the crash report
|
||||
NSData *data = [NSData dataWithData:[appDelegate getCrashData]];
|
||||
if (data == nil) {
|
||||
NSLog(@"Could not load crash report: %@", error);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Decode it */
|
||||
PLCrashReport *crashLog = [[PLCrashReport alloc] initWithData: data error: &error];
|
||||
if (crashLog == nil) {
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
/* Map to apple style OS nane */
|
||||
const char *osName;
|
||||
switch (crashLog.systemInfo.operatingSystem) {
|
||||
case PLCrashReportOperatingSystemiPhoneOS:
|
||||
osName = "iPhone OS";
|
||||
break;
|
||||
case PLCrashReportOperatingSystemiPhoneSimulator:
|
||||
osName = "Mac OS X";
|
||||
break;
|
||||
default:
|
||||
osName = "iPhone OS";
|
||||
break;
|
||||
}
|
||||
|
||||
/* Map to Apple-style code type */
|
||||
const char *codeType;
|
||||
switch (crashLog.systemInfo.architecture) {
|
||||
case PLCrashReportArchitectureARM:
|
||||
codeType = "ARM";
|
||||
break;
|
||||
default:
|
||||
codeType = "ARM";
|
||||
break;
|
||||
}
|
||||
|
||||
NSString *currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
|
||||
_crashLogAppVersion = [NSString stringWithFormat:@"%@", crashLog.applicationInfo.applicationVersion];
|
||||
if ([currentVersion compare:crashLog.applicationInfo.applicationVersion] != NSOrderedSame)
|
||||
{
|
||||
_crashIdenticalCurrentVersion = NO;
|
||||
}
|
||||
|
||||
xmlString = [NSString stringWithFormat:@"%@Incident Identifier: [TODO]\n", xmlString];
|
||||
xmlString = [NSString stringWithFormat:@"%@CrashReporter Key: [TODO]\n", xmlString];
|
||||
xmlString = [NSString stringWithFormat:@"%@Process: [TODO]\n", xmlString];
|
||||
xmlString = [NSString stringWithFormat:@"%@Path: [TODO]\n", xmlString];
|
||||
xmlString = [NSString stringWithFormat:@"%@Identifier: %s\n", xmlString, [crashLog.applicationInfo.applicationIdentifier UTF8String]];
|
||||
xmlString = [NSString stringWithFormat:@"%@Version: %s\n", xmlString, [crashLog.applicationInfo.applicationVersion UTF8String]];
|
||||
xmlString = [NSString stringWithFormat:@"%@Code Type: %s\n", xmlString, codeType];
|
||||
xmlString = [NSString stringWithFormat:@"%@Parent Process: [TODO]\n", xmlString];
|
||||
|
||||
xmlString = [NSString stringWithFormat:@"%@\n", xmlString];
|
||||
|
||||
/* System info */
|
||||
xmlString = [NSString stringWithFormat:@"%@Date/Time: %s\n", xmlString, [[crashLog.systemInfo.timestamp description] UTF8String]];
|
||||
xmlString = [NSString stringWithFormat:@"%@OS Version: %s %s\n", xmlString, osName, [crashLog.systemInfo.operatingSystemVersion UTF8String]];
|
||||
xmlString = [NSString stringWithFormat:@"%@Report Version: 103\n", xmlString];
|
||||
|
||||
xmlString = [NSString stringWithFormat:@"%@\n", xmlString];
|
||||
|
||||
/* Exception code */
|
||||
xmlString = [NSString stringWithFormat:@"%@Exception Type: %s\n", xmlString, [crashLog.signalInfo.name UTF8String]];
|
||||
xmlString = [NSString stringWithFormat:@"%@Exception Codes: %s at 0x%" PRIx64 "\n", xmlString, [crashLog.signalInfo.code UTF8String], crashLog.signalInfo.address];
|
||||
|
||||
for (PLCrashReportThreadInfo *thread in crashLog.threads) {
|
||||
if (thread.crashed) {
|
||||
xmlString = [NSString stringWithFormat:@"%@Crashed Thread: %d\n", xmlString, thread.threadNumber];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
xmlString = [NSString stringWithFormat:@"%@\n", xmlString];
|
||||
|
||||
/* Threads */
|
||||
for (PLCrashReportThreadInfo *thread in crashLog.threads) {
|
||||
if (thread.crashed)
|
||||
xmlString = [NSString stringWithFormat:@"%@Thread %d Crashed:\n", xmlString, thread.threadNumber];
|
||||
else
|
||||
xmlString = [NSString stringWithFormat:@"%@Thread %d:\n", xmlString, thread.threadNumber];
|
||||
for (NSUInteger frame_idx = 0; frame_idx < [thread.stackFrames count]; frame_idx++) {
|
||||
PLCrashReportStackFrameInfo *frameInfo = [thread.stackFrames objectAtIndex: frame_idx];
|
||||
PLCrashReportBinaryImageInfo *imageInfo;
|
||||
|
||||
/* Base image address containing instrumention pointer, offset of the IP from that base
|
||||
* address, and the associated image name */
|
||||
uint64_t baseAddress = 0x0;
|
||||
uint64_t pcOffset = 0x0;
|
||||
const char *imageName = "\?\?\?";
|
||||
|
||||
imageInfo = [crashLog imageForAddress: frameInfo.instructionPointer];
|
||||
if (imageInfo != nil) {
|
||||
imageName = [[imageInfo.imageName lastPathComponent] UTF8String];
|
||||
baseAddress = imageInfo.imageBaseAddress;
|
||||
pcOffset = frameInfo.instructionPointer - imageInfo.imageBaseAddress;
|
||||
}
|
||||
|
||||
xmlString = [NSString stringWithFormat:@"%@%-4d%-36s0x%08" PRIx64 " 0x%" PRIx64 " + %" PRId64 "\n", xmlString,
|
||||
frame_idx, imageName, frameInfo.instructionPointer, baseAddress, pcOffset];
|
||||
}
|
||||
xmlString = [NSString stringWithFormat:@"%@\n", xmlString];
|
||||
}
|
||||
|
||||
/* Images */
|
||||
xmlString = [NSString stringWithFormat:@"%@Binary Images:\n", xmlString];
|
||||
for (PLCrashReportBinaryImageInfo *imageInfo in crashLog.images) {
|
||||
NSString *uuid;
|
||||
/* Fetch the UUID if it exists */
|
||||
if (imageInfo.hasImageUUID)
|
||||
uuid = imageInfo.imageUUID;
|
||||
else
|
||||
uuid = @"???";
|
||||
|
||||
/* base_address - terminating_address file_name identifier (<version>) <uuid> file_path */
|
||||
xmlString = [NSString stringWithFormat:@"%@0x%" PRIx64 " - 0x%" PRIx64 " %s \?\?\? (\?\?\?) <%s> %s\n", xmlString,
|
||||
imageInfo.imageBaseAddress,
|
||||
imageInfo.imageBaseAddress + imageInfo.imageSize,
|
||||
[[imageInfo.imageName lastPathComponent] UTF8String],
|
||||
[uuid UTF8String],
|
||||
[imageInfo.imageName UTF8String]];
|
||||
}
|
||||
|
||||
finish:
|
||||
if ([xmlString length] == 0)
|
||||
{
|
||||
_memoryCrash = YES;
|
||||
xmlString = [NSString stringWithFormat:@"Memory Warning!"];
|
||||
}
|
||||
|
||||
return xmlString;
|
||||
}
|
||||
|
||||
|
||||
- (void) sendCrashData
|
||||
{
|
||||
CrashReporterDemoAppDelegate *appDelegate = (CrashReporterDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
|
||||
|
||||
NSString *device = @"";
|
||||
NSString *contact = @"";
|
||||
|
||||
NSString *log = [self convert];
|
||||
|
||||
NSString *xml = [NSString stringWithFormat:@"<crashlog><version>%@</version><crashappversion>%@</crashappversion><startmemory>%u</startmemory><endmemory>%u</endmemory><contact>%@</contact><log><![CDATA[%@]]></log></crashlog>",
|
||||
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"],
|
||||
_crashLogAppVersion,
|
||||
[appDelegate getLastStartupFreeMemory],
|
||||
[appDelegate getLastShutdownFreeMemory],
|
||||
device,
|
||||
contact,
|
||||
log];
|
||||
int result = [self postXML:xml toURL:[NSURL URLWithString:CRASH_URL]];
|
||||
|
||||
[self removeHUD];
|
||||
|
||||
if (result < CRASH_TYPE_FIXED_NEXTRELEASE || _memoryCrash || !_crashIdenticalCurrentVersion)
|
||||
{
|
||||
[appDelegate finishCrashLog];
|
||||
} else if (!_memoryCrash && _crashIdenticalCurrentVersion) {
|
||||
// show the user some more info about the crash he/she had
|
||||
[self showCrashStatusMessage:result];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void) showCrashStatusMessage:(int)type
|
||||
{
|
||||
// the bug has already been fixed and it will be included in the next release
|
||||
if (type == CRASH_TYPE_FIXED_NEXTRELEASE)
|
||||
{
|
||||
_alertType = 20;
|
||||
_alertView = nil;
|
||||
_alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"CrashResponseTitle", @"Title for the alertview giving feedback about the crash")
|
||||
message:NSLocalizedString(@"CrashResponseNextRelease", @"Full text telling the bug is fixed and will be available in the next release")
|
||||
delegate:self
|
||||
cancelButtonTitle:NSLocalizedString(@"Ok", @"")
|
||||
otherButtonTitles:nil
|
||||
];
|
||||
[_alertView show];
|
||||
[_alertView release];
|
||||
} else if (type == CRASH_TYPE_FIXED_SENDTOAPPLE) {
|
||||
// the bugfix release has been send to apple
|
||||
_alertType = 21;
|
||||
_alertView = nil;
|
||||
_alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"CrashResponseTitle", @"Title for the alertview giving feedback about the crash")
|
||||
message:NSLocalizedString(@"CrashResponseWaitingApple", @"Full text telling the bug is fixed and the new release is waiting at Apple")
|
||||
delegate:self
|
||||
cancelButtonTitle:NSLocalizedString(@"Ok", @"")
|
||||
otherButtonTitles:nil
|
||||
];
|
||||
[_alertView show];
|
||||
[_alertView release];
|
||||
} else if (type == CRASH_TYPE_FIXED_AVAILABLE) {
|
||||
// the bugfix release is available
|
||||
_alertType = 22;
|
||||
_alertView = nil;
|
||||
_alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"CrashResponseTitle", @"Title for the alertview giving feedback about the crash")
|
||||
message:NSLocalizedString(@"CrashResponseAvailable", @"Full text telling the bug is fixed and an update is available in the AppStore")
|
||||
delegate:self
|
||||
cancelButtonTitle:NSLocalizedString(@"Ok", @"")
|
||||
otherButtonTitles:nil
|
||||
];
|
||||
[_alertView show];
|
||||
[_alertView release];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark postxml
|
||||
|
||||
- (NSMutableURLRequest *)requestWithURL:(NSURL *)theURL
|
||||
{
|
||||
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:theURL];
|
||||
[req setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];
|
||||
[req setValue:USER_AGENT forHTTPHeaderField:@"User-Agent"];
|
||||
[req setTimeoutInterval: 15];
|
||||
return req;
|
||||
}
|
||||
|
||||
- (NSString *)getBoundary
|
||||
{
|
||||
return @"----FOO";
|
||||
}
|
||||
|
||||
|
||||
- (int)postXML:(NSString*)xml toURL:(NSURL*)url
|
||||
{
|
||||
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
|
||||
|
||||
[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];
|
||||
[request setValue:USER_AGENT forHTTPHeaderField:@"User-Agent"];
|
||||
[request setTimeoutInterval: 15];
|
||||
[request setHTTPMethod:@"POST"];
|
||||
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data, boundary=%@", [self getBoundary]];
|
||||
[request setValue:contentType forHTTPHeaderField:@"Content-type"];
|
||||
|
||||
NSMutableData *postBody = [NSMutableData data];
|
||||
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", [self getBoundary]] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[@"Content-Disposition: form-data; name=\"xmlstring\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", [self getBoundary]] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[request setHTTPBody:postBody];
|
||||
|
||||
_serverResult = CRASH_TYPE_UNKNOWN;
|
||||
|
||||
NSHTTPURLResponse *response;
|
||||
NSError *errmsg = NULL;
|
||||
|
||||
NSData *theResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&errmsg];
|
||||
int statusCode = [response statusCode];
|
||||
|
||||
if (statusCode >= 200 && statusCode < 400)
|
||||
{
|
||||
// NSLog(@"%@",url);
|
||||
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:theResponseData];
|
||||
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
|
||||
[parser setDelegate:self];
|
||||
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
|
||||
[parser setShouldProcessNamespaces:NO];
|
||||
[parser setShouldReportNamespacePrefixes:NO];
|
||||
[parser setShouldResolveExternalEntities:NO];
|
||||
|
||||
[parser parse];
|
||||
|
||||
[parser release];
|
||||
}
|
||||
|
||||
return _serverResult;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark UIAlertViewDelegate
|
||||
|
||||
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
|
||||
{
|
||||
CrashReporterDemoAppDelegate *appDelegate = (CrashReporterDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
|
||||
switch (_alertType)
|
||||
{
|
||||
case 10:
|
||||
if (buttonIndex == 1)
|
||||
{
|
||||
[self showHUD:NSLocalizedString(@"Sending", @"Text showing in a processing box that the crash data is being uploaded to the server")];
|
||||
} else if (buttonIndex == 2) {
|
||||
[appDelegate setAutoSendCrashData:YES];
|
||||
[self showHUD:NSLocalizedString(@"Sending", @"Text showing in a processing box that the crash data is being uploaded to the server")];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// invoke the selected action from the actionsheet for a location element
|
||||
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
|
||||
{
|
||||
CrashReporterDemoAppDelegate *appDelegate = (CrashReporterDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
|
||||
switch (_alertType)
|
||||
{
|
||||
case 10:
|
||||
if (buttonIndex == 1 || buttonIndex == 2)
|
||||
{
|
||||
[self sendCrashData];
|
||||
} else {
|
||||
[appDelegate finishCrashLog];
|
||||
}
|
||||
break;
|
||||
case 20:
|
||||
case 21:
|
||||
case 22:
|
||||
[appDelegate finishCrashLog];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark NSXMLParser
|
||||
|
||||
- (void)parserDidStartDocument:(NSXMLParser *)parser
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
- (void)parserDidEndDocument:(NSXMLParser *)parser
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
- (void)parseXMLFileAtURL:(NSString *)url parseError:(NSError **)error
|
||||
{
|
||||
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
|
||||
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
|
||||
[parser setDelegate:self];
|
||||
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
|
||||
[parser setShouldProcessNamespaces:NO];
|
||||
[parser setShouldReportNamespacePrefixes:NO];
|
||||
[parser setShouldResolveExternalEntities:NO];
|
||||
|
||||
[parser parse];
|
||||
|
||||
NSError *parseError = [parser parserError];
|
||||
if (parseError && error) {
|
||||
*error = parseError;
|
||||
}
|
||||
|
||||
[parser release];
|
||||
}
|
||||
|
||||
|
||||
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
|
||||
{
|
||||
if (qName)
|
||||
{
|
||||
elementName = qName;
|
||||
}
|
||||
|
||||
if ([elementName isEqualToString:@"result"]) {
|
||||
_contentOfProperty = [NSMutableString string];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
|
||||
{
|
||||
if (qName)
|
||||
{
|
||||
elementName = qName;
|
||||
}
|
||||
|
||||
if ([elementName isEqualToString:@"result"]) {
|
||||
_serverResult = [_contentOfProperty intValue];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
|
||||
{
|
||||
if (_contentOfProperty)
|
||||
{
|
||||
// If the current element is one whose content we care about, append 'string'
|
||||
// to the property that holds the content of the current element.
|
||||
if (string != nil)
|
||||
{
|
||||
[_contentOfProperty appendString:string];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
|
@ -1,351 +0,0 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 45;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1D3623260D0F684500981E51 /* CrashReporterDemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CrashReporterDemoAppDelegate.m */; };
|
||||
1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
|
||||
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
|
||||
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
|
||||
1E94B43D0F5F227A002D4D2C /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E94B43C0F5F227A002D4D2C /* CrashReporter.framework */; };
|
||||
1E94B4850F5F229D002D4D2C /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 1E94B4840F5F229D002D4D2C /* Settings.bundle */; };
|
||||
1E94B4E80F5F2539002D4D2C /* StartupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E94B4E20F5F2539002D4D2C /* StartupViewController.m */; };
|
||||
1E94B4F90F5F25BD002D4D2C /* HudView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E94B4F80F5F25BD002D4D2C /* HudView.m */; };
|
||||
1E94B5840F5F2AA4002D4D2C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E94B5830F5F2AA4002D4D2C /* Localizable.strings */; };
|
||||
288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
|
||||
2899E5220DE3E06400AC0155 /* CrashReporterDemoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* CrashReporterDemoViewController.xib */; };
|
||||
28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
|
||||
28D7ACF80DDB3853001CB0EB /* CrashReporterDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* CrashReporterDemoViewController.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
1D3623240D0F684500981E51 /* CrashReporterDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporterDemoAppDelegate.h; sourceTree = "<group>"; };
|
||||
1D3623250D0F684500981E51 /* CrashReporterDemoAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CrashReporterDemoAppDelegate.m; sourceTree = "<group>"; };
|
||||
1D6058910D05DD3D006BFB54 /* CrashReporterDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CrashReporterDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
1E65D8660F5FDE96004D74B8 /* crash.php */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.php; path = crash.php; sourceTree = "<group>"; };
|
||||
1E65D8690F5FDEA2004D74B8 /* database.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = database.txt; sourceTree = "<group>"; };
|
||||
1E94B43C0F5F227A002D4D2C /* CrashReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CrashReporter.framework; sourceTree = "<group>"; };
|
||||
1E94B4840F5F229D002D4D2C /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||
1E94B4E10F5F2539002D4D2C /* StartupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StartupViewController.h; sourceTree = "<group>"; };
|
||||
1E94B4E20F5F2539002D4D2C /* StartupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StartupViewController.m; sourceTree = "<group>"; };
|
||||
1E94B4F70F5F25BD002D4D2C /* HudView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HudView.h; sourceTree = "<group>"; };
|
||||
1E94B4F80F5F25BD002D4D2C /* HudView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HudView.m; sourceTree = "<group>"; };
|
||||
1E94B5730F5F2A97002D4D2C /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
1E94B5850F5F2AB1002D4D2C /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
1E94B5860F5F2AB5002D4D2C /* German */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = German; path = German.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
1E94B5870F5F2AB8002D4D2C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
1E94B5880F5F2ABC002D4D2C /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
1E94B5890F5F2ABF002D4D2C /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
1E94B58A0F5F2AC1002D4D2C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||
2899E5210DE3E06400AC0155 /* CrashReporterDemoViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CrashReporterDemoViewController.xib; sourceTree = "<group>"; };
|
||||
28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
|
||||
28D7ACF60DDB3853001CB0EB /* CrashReporterDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporterDemoViewController.h; sourceTree = "<group>"; };
|
||||
28D7ACF70DDB3853001CB0EB /* CrashReporterDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CrashReporterDemoViewController.m; sourceTree = "<group>"; };
|
||||
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
32CA4F630368D1EE00C91783 /* CrashReporterDemo_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporterDemo_Prefix.pch; sourceTree = "<group>"; };
|
||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
|
||||
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
|
||||
288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */,
|
||||
1E94B43D0F5F227A002D4D2C /* CrashReporter.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
080E96DDFE201D6D7F000001 /* Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E94B4DF0F5F2539002D4D2C /* Maitenance */,
|
||||
1E94B4F50F5F2592002D4D2C /* View Controller */,
|
||||
1E94B4F60F5F25A7002D4D2C /* UI Classes */,
|
||||
1D3623240D0F684500981E51 /* CrashReporterDemoAppDelegate.h */,
|
||||
1D3623250D0F684500981E51 /* CrashReporterDemoAppDelegate.m */,
|
||||
);
|
||||
path = Classes;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
19C28FACFE9D520D11CA2CBB /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1D6058910D05DD3D006BFB54 /* CrashReporterDemo.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E94B4DF0F5F2539002D4D2C /* Maitenance */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E94B4E00F5F2539002D4D2C /* View Controllers */,
|
||||
);
|
||||
name = Maitenance;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E94B4E00F5F2539002D4D2C /* View Controllers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E94B4E10F5F2539002D4D2C /* StartupViewController.h */,
|
||||
1E94B4E20F5F2539002D4D2C /* StartupViewController.m */,
|
||||
);
|
||||
name = "View Controllers";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E94B4F50F5F2592002D4D2C /* View Controller */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
28D7ACF60DDB3853001CB0EB /* CrashReporterDemoViewController.h */,
|
||||
28D7ACF70DDB3853001CB0EB /* CrashReporterDemoViewController.m */,
|
||||
);
|
||||
name = "View Controller";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E94B4F60F5F25A7002D4D2C /* UI Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E94B4F70F5F25BD002D4D2C /* HudView.h */,
|
||||
1E94B4F80F5F25BD002D4D2C /* HudView.m */,
|
||||
);
|
||||
name = "UI Classes";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
080E96DDFE201D6D7F000001 /* Classes */,
|
||||
29B97315FDCFA39411CA2CEA /* Other Sources */,
|
||||
29B97317FDCFA39411CA2CEA /* Resources */,
|
||||
29B97323FDCFA39411CA2CEA /* Frameworks */,
|
||||
19C28FACFE9D520D11CA2CBB /* Products */,
|
||||
);
|
||||
name = CustomTemplate;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
32CA4F630368D1EE00C91783 /* CrashReporterDemo_Prefix.pch */,
|
||||
29B97316FDCFA39411CA2CEA /* main.m */,
|
||||
);
|
||||
name = "Other Sources";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97317FDCFA39411CA2CEA /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E65D8690F5FDEA2004D74B8 /* database.txt */,
|
||||
1E65D8660F5FDE96004D74B8 /* crash.php */,
|
||||
1E94B4840F5F229D002D4D2C /* Settings.bundle */,
|
||||
2899E5210DE3E06400AC0155 /* CrashReporterDemoViewController.xib */,
|
||||
28AD733E0D9D9553002E5188 /* MainWindow.xib */,
|
||||
8D1107310486CEB800E47090 /* Info.plist */,
|
||||
1E94B5830F5F2AA4002D4D2C /* Localizable.strings */,
|
||||
);
|
||||
name = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E94B43C0F5F227A002D4D2C /* CrashReporter.framework */,
|
||||
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
|
||||
1D30AB110D05D00D00671497 /* Foundation.framework */,
|
||||
288765A40DF7441C002DB57D /* CoreGraphics.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
1D6058900D05DD3D006BFB54 /* CrashReporterDemo */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CrashReporterDemo" */;
|
||||
buildPhases = (
|
||||
1D60588D0D05DD3D006BFB54 /* Resources */,
|
||||
1D60588E0D05DD3D006BFB54 /* Sources */,
|
||||
1D60588F0D05DD3D006BFB54 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = CrashReporterDemo;
|
||||
productName = CrashReporterDemo;
|
||||
productReference = 1D6058910D05DD3D006BFB54 /* CrashReporterDemo.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
29B97313FDCFA39411CA2CEA /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CrashReporterDemo" */;
|
||||
compatibilityVersion = "Xcode 3.1";
|
||||
hasScannedForEncodings = 1;
|
||||
knownRegions = (
|
||||
English,
|
||||
Japanese,
|
||||
French,
|
||||
German,
|
||||
fi,
|
||||
es,
|
||||
pt,
|
||||
ru,
|
||||
);
|
||||
mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
1D6058900D05DD3D006BFB54 /* CrashReporterDemo */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
1D60588D0D05DD3D006BFB54 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */,
|
||||
2899E5220DE3E06400AC0155 /* CrashReporterDemoViewController.xib in Resources */,
|
||||
1E94B4850F5F229D002D4D2C /* Settings.bundle in Resources */,
|
||||
1E94B5840F5F2AA4002D4D2C /* Localizable.strings in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
1D60588E0D05DD3D006BFB54 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1D60589B0D05DD56006BFB54 /* main.m in Sources */,
|
||||
1D3623260D0F684500981E51 /* CrashReporterDemoAppDelegate.m in Sources */,
|
||||
28D7ACF80DDB3853001CB0EB /* CrashReporterDemoViewController.m in Sources */,
|
||||
1E94B4E80F5F2539002D4D2C /* StartupViewController.m in Sources */,
|
||||
1E94B4F90F5F25BD002D4D2C /* HudView.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
1E94B5830F5F2AA4002D4D2C /* Localizable.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
1E94B5730F5F2A97002D4D2C /* English */,
|
||||
1E94B5850F5F2AB1002D4D2C /* French */,
|
||||
1E94B5860F5F2AB5002D4D2C /* German */,
|
||||
1E94B5870F5F2AB8002D4D2C /* fi */,
|
||||
1E94B5880F5F2ABC002D4D2C /* es */,
|
||||
1E94B5890F5F2ABF002D4D2C /* pt */,
|
||||
1E94B58A0F5F2AC1002D4D2C /* ru */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
1D6058940D05DD3E006BFB54 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)\"",
|
||||
);
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = CrashReporterDemo_Prefix.pch;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
PRODUCT_NAME = CrashReporterDemo;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1D6058950D05DD3E006BFB54 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)\"",
|
||||
);
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = CrashReporterDemo_Prefix.pch;
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
PRODUCT_NAME = CrashReporterDemo;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
C01FCF4F08A954540054247B /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PREBINDING = NO;
|
||||
SDKROOT = iphoneos2.2.1;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
C01FCF5008A954540054247B /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
PREBINDING = NO;
|
||||
SDKROOT = iphoneos2.2.1;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CrashReporterDemo" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1D6058940D05DD3E006BFB54 /* Debug */,
|
||||
1D6058950D05DD3E006BFB54 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CrashReporterDemo" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
C01FCF4F08A954540054247B /* Debug */,
|
||||
C01FCF5008A954540054247B /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
|
||||
}
|
|
@ -1,309 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.03">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">528</int>
|
||||
<string key="IBDocument.SystemVersion">9G55</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">677</string>
|
||||
<string key="IBDocument.AppKitVersion">949.43</string>
|
||||
<string key="IBDocument.HIToolboxVersion">353.00</string>
|
||||
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<integer value="6"/>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.PluginDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBProxyObject" id="372490531">
|
||||
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
|
||||
</object>
|
||||
<object class="IBProxyObject" id="843779117">
|
||||
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
|
||||
</object>
|
||||
<object class="IBUIView" id="774585933">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">274</int>
|
||||
<object class="NSMutableArray" key="NSSubviews">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBUIButton" id="424189206">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{68, 105}, {184, 37}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<int key="IBUIContentHorizontalAlignment">0</int>
|
||||
<int key="IBUIContentVerticalAlignment">0</int>
|
||||
<object class="NSFont" key="IBUIFont" id="602268476">
|
||||
<string key="NSName">Helvetica-Bold</string>
|
||||
<double key="NSSize">1.500000e+01</double>
|
||||
<int key="NSfFlags">16</int>
|
||||
</object>
|
||||
<int key="IBUIButtonType">1</int>
|
||||
<string key="IBUIHighlightedTitle">Trigger Memory Leak</string>
|
||||
<string key="IBUIDisabledTitle">Trigger Memory Leak</string>
|
||||
<string key="IBUISelectedTitle">Trigger Memory Leak</string>
|
||||
<string key="IBUINormalTitle">Trigger Memory Leak</string>
|
||||
<object class="NSColor" key="IBUIHighlightedTitleColor" id="115023985">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MSAxIDEAA</bytes>
|
||||
</object>
|
||||
<object class="NSColor" key="IBUINormalTitleColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBUIButton" id="268644568">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{72, 275}, {176, 37}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<int key="IBUIContentHorizontalAlignment">0</int>
|
||||
<int key="IBUIContentVerticalAlignment">0</int>
|
||||
<reference key="IBUIFont" ref="602268476"/>
|
||||
<int key="IBUIButtonType">1</int>
|
||||
<string key="IBUIHighlightedTitle">Trigger Crash</string>
|
||||
<string key="IBUIDisabledTitle">Trigger Crash</string>
|
||||
<string key="IBUISelectedTitle">Trigger Crash</string>
|
||||
<string key="IBUINormalTitle">Trigger Crash</string>
|
||||
<reference key="IBUIHighlightedTitleColor" ref="115023985"/>
|
||||
<object class="NSColor" key="IBUINormalTitleColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBUILabel" id="492400960">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{13, 150}, {293, 21}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClipsSubviews">YES</bool>
|
||||
<bool key="IBUIUserInteractionEnabled">NO</bool>
|
||||
<string key="IBUIText">This probably only works on the device!</string>
|
||||
<object class="NSFont" key="IBUIFont">
|
||||
<string key="NSName">Helvetica</string>
|
||||
<double key="NSSize">1.300000e+01</double>
|
||||
<int key="NSfFlags">16</int>
|
||||
</object>
|
||||
<object class="NSColor" key="IBUITextColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MCAwIDAAA</bytes>
|
||||
</object>
|
||||
<nil key="IBUIHighlightedColor"/>
|
||||
<int key="IBUIBaselineAdjustment">1</int>
|
||||
<float key="IBUIMinimumFontSize">1.000000e+01</float>
|
||||
<int key="IBUITextAlignment">1</int>
|
||||
</object>
|
||||
</object>
|
||||
<string key="NSFrameSize">{320, 460}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MC43NQA</bytes>
|
||||
<object class="NSColorSpace" key="NSCustomColorSpace">
|
||||
<int key="NSID">2</int>
|
||||
</object>
|
||||
</object>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<object class="NSMutableArray" key="connectionRecords">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">view</string>
|
||||
<reference key="source" ref="372490531"/>
|
||||
<reference key="destination" ref="774585933"/>
|
||||
</object>
|
||||
<int key="connectionID">7</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchEventConnection" key="connection">
|
||||
<string key="label">triggerCrash</string>
|
||||
<reference key="source" ref="268644568"/>
|
||||
<reference key="destination" ref="372490531"/>
|
||||
<int key="IBEventType">7</int>
|
||||
</object>
|
||||
<int key="connectionID">14</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchEventConnection" key="connection">
|
||||
<string key="label">triggerMemoryLeak</string>
|
||||
<reference key="source" ref="424189206"/>
|
||||
<reference key="destination" ref="372490531"/>
|
||||
<int key="IBEventType">7</int>
|
||||
</object>
|
||||
<int key="connectionID">15</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">triggerButtonCrash</string>
|
||||
<reference key="source" ref="372490531"/>
|
||||
<reference key="destination" ref="268644568"/>
|
||||
</object>
|
||||
<int key="connectionID">16</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">triggerButtonMemoryLeak</string>
|
||||
<reference key="source" ref="372490531"/>
|
||||
<reference key="destination" ref="424189206"/>
|
||||
</object>
|
||||
<int key="connectionID">17</int>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<object class="NSArray" key="orderedObjects">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<object class="NSArray" key="object" id="360949347">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="372490531"/>
|
||||
<reference key="parent" ref="360949347"/>
|
||||
<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="843779117"/>
|
||||
<reference key="parent" ref="360949347"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">6</int>
|
||||
<reference key="object" ref="774585933"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="424189206"/>
|
||||
<reference ref="268644568"/>
|
||||
<reference ref="492400960"/>
|
||||
</object>
|
||||
<reference key="parent" ref="360949347"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">8</int>
|
||||
<reference key="object" ref="424189206"/>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">9</int>
|
||||
<reference key="object" ref="268644568"/>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">18</int>
|
||||
<reference key="object" ref="492400960"/>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="flattenedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>-1.CustomClassName</string>
|
||||
<string>-2.CustomClassName</string>
|
||||
<string>18.IBPluginDependency</string>
|
||||
<string>6.IBEditorWindowLastContentRect</string>
|
||||
<string>6.IBPluginDependency</string>
|
||||
<string>8.IBPluginDependency</string>
|
||||
<string>9.IBPluginDependency</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>CrashReporterDemoViewController</string>
|
||||
<string>UIResponder</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>{{1789, 329}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="unlocalizedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="activeLocalization"/>
|
||||
<object class="NSMutableDictionary" key="localizations">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">18</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">CrashReporterDemoViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>triggerCrash</string>
|
||||
<string>triggerMemoryLeak</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>id</string>
|
||||
<string>id</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>triggerButtonCrash</string>
|
||||
<string>triggerButtonMemoryLeak</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>UIButton</string>
|
||||
<string>UIButton</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/CrashReporterDemoViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.LastKnownRelativeProjectPath">CrashReporterDemo.xcodeproj</string>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
</data>
|
||||
</archive>
|
|
@ -1,8 +0,0 @@
|
|||
//
|
||||
// Prefix header for all source files of the 'CrashReporterDemo' target in the 'CrashReporterDemo' project
|
||||
//
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#endif
|
Двоичные данные
contrib/php-crashreporter-demo/English.lproj/Localizable.strings
Двоичные данные
contrib/php-crashreporter-demo/English.lproj/Localizable.strings
Двоичный файл не отображается.
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
Localizable.strings
|
||||
CrashReporterDemo
|
||||
|
||||
Created by Andreas Linde on 04.03.09.
|
||||
Copyright 2009 Andreas Linde. All rights reserved.
|
||||
*/
|
||||
|
||||
/* Global strings */
|
||||
|
||||
/* For dialogs yes buttons */
|
||||
"Yes" = "Oui";
|
||||
|
||||
/* For dialogs no buttons */
|
||||
"No" = "Non";
|
||||
|
||||
/* For dialogs ok buttons */
|
||||
"Ok" = "Ok";
|
||||
|
||||
|
||||
/* Crash dialog */
|
||||
|
||||
/* Title showing in the alert box when crash report data has been found */
|
||||
"CrashDataFoundTitle" = "Données du plantage";
|
||||
|
||||
/* Description explaining that crash data has been found and ask the user if the data might be uplaoded to the developers server */
|
||||
"CrashDataFoundDescription" = "Le programme s'est planté auparavant. Seriez-vous d'accord de fournir les données d'accident de façon anonyme, ils peuvent essayer de résoudre le problème.";
|
||||
|
||||
/* Alert box button if the users wants to send crash data always automatically */
|
||||
"Always" = "Toujours";
|
||||
|
||||
/* Text showing in a processing box that the crash data is being uploaded to the server */
|
||||
"Sending" = "Envoi ...";
|
||||
|
||||
/* Title for the alertview giving feedback about the crash */
|
||||
"CrashResponseTitle" = "Bug status";
|
||||
|
||||
/* Full text telling the bug is fixed and will be available in the next release */
|
||||
"CrashResponseNextRelease" = "The bug that caused your problem is already solved and the solution will be included in the next version of YOURAPPNAME";
|
||||
|
||||
/* Full text telling the bug is fixed and the new release is waiting at Apple */
|
||||
"CrashResponseWaitingApple" = "The bug that caused your problem is already solved and the new version of YOURAPPNAME is waiting for approval by Apple";
|
||||
|
||||
/* Full text telling the bug is fixed and an update is available in the AppStore */
|
||||
"CrashResponseAvailable" = "The bug that caused your problem is already solved and the new version of YOURAPPNAME is available. Please update!";
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
Localizable.strings
|
||||
CrashReporterDemo
|
||||
|
||||
Created by Andreas Linde on 04.03.09.
|
||||
Copyright 2009 Andreas Linde. All rights reserved.
|
||||
*/
|
||||
|
||||
/* Global strings */
|
||||
|
||||
/* For dialogs yes buttons */
|
||||
"Yes" = "Ja";
|
||||
|
||||
/* For dialogs no buttons */
|
||||
"No" = "Nein";
|
||||
|
||||
/* For dialogs ok buttons */
|
||||
"Ok" = "Ok";
|
||||
|
||||
|
||||
/* Crash dialog */
|
||||
|
||||
/* Title showing in the alert box when crash report data has been found */
|
||||
"CrashDataFoundTitle" = "Problem entdeckt";
|
||||
|
||||
/* Description explaining that crash data has been found and ask the user if the data might be uplaoded to the developers server */
|
||||
"CrashDataFoundDescription" = "Das Program ist leider das letzte Mal abgestürzt. Möchten Sie die anonymen Probleminformationen an die Entwickler senden, damit diese versuchen können das Problem zu beheben?";
|
||||
|
||||
/* Alert box button if the users wants to send crash data always automatically */
|
||||
"Always" = "Immer";
|
||||
|
||||
/* Text showing in a processing box that the crash data is being uploaded to the server */
|
||||
"Sending" = "Sende ...";
|
||||
|
||||
/* Title for the alertview giving feedback about the crash */
|
||||
"CrashResponseTitle" = "Bug status";
|
||||
|
||||
/* Full text telling the bug is fixed and will be available in the next release */
|
||||
"CrashResponseNextRelease" = "Die Ursache für den Fehler wurde bereits behoben und wird in der folgenden Version von YOURAPPNAME enthalten sein";
|
||||
|
||||
/* Full text telling the bug is fixed and the new release is waiting at Apple */
|
||||
"CrashResponseWaitingApple" = "Die Ursache für den Fehler wurde bereits behoben und die neue Version von YOURAPPNAME wartet auf die Freigabe von Apple";
|
||||
|
||||
/* Full text telling the bug is fixed and an update is available in the AppStore */
|
||||
"CrashResponseAvailable" = "Die Ursache für den Fehler wurde bereits behoben und die neue Version von YOURAPPNAME ist verfügbar. Bitte aktualisieren!";
|
|
@ -1,30 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.yourcompany.${PRODUCT_NAME:identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainWindow</string>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1,455 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.03">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">528</int>
|
||||
<string key="IBDocument.SystemVersion">9G55</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">677</string>
|
||||
<string key="IBDocument.AppKitVersion">949.43</string>
|
||||
<string key="IBDocument.HIToolboxVersion">353.00</string>
|
||||
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<integer value="10"/>
|
||||
<integer value="17"/>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.PluginDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBProxyObject" id="841351856">
|
||||
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
|
||||
</object>
|
||||
<object class="IBProxyObject" id="427554174">
|
||||
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
|
||||
</object>
|
||||
<object class="IBUICustomObject" id="664661524"/>
|
||||
<object class="IBUIViewController" id="943309135">
|
||||
<string key="IBUINibName">CrashReporterDemoViewController</string>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
</object>
|
||||
<object class="IBUIWindow" id="117978783">
|
||||
<nil key="NSNextResponder"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrameSize">{320, 480}</string>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MSAxIDEAA</bytes>
|
||||
</object>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
</object>
|
||||
<object class="IBUIViewController" id="453364069">
|
||||
<object class="IBUIView" key="IBUIView" id="715980885">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">-2147483374</int>
|
||||
<object class="NSMutableArray" key="NSSubviews">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBUIView" id="489581855">
|
||||
<reference key="NSNextResponder" ref="715980885"/>
|
||||
<int key="NSvFlags">274</int>
|
||||
<string key="NSFrame">{{60, 165}, {200, 150}}</string>
|
||||
<reference key="NSSuperview" ref="715980885"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MCAwIDAgMAA</bytes>
|
||||
</object>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<bool key="IBUIUserInteractionEnabled">NO</bool>
|
||||
</object>
|
||||
<object class="IBUILabel" id="591361543">
|
||||
<reference key="NSNextResponder" ref="715980885"/>
|
||||
<int key="NSvFlags">290</int>
|
||||
<string key="NSFrame">{{80, 177}, {160, 21}}</string>
|
||||
<reference key="NSSuperview" ref="715980885"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MCAwAA</bytes>
|
||||
</object>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClipsSubviews">YES</bool>
|
||||
<bool key="IBUIUserInteractionEnabled">NO</bool>
|
||||
<string key="IBUIText"/>
|
||||
<object class="NSFont" key="IBUIFont">
|
||||
<string key="NSName">Helvetica</string>
|
||||
<double key="NSSize">1.800000e+01</double>
|
||||
<int key="NSfFlags">16</int>
|
||||
</object>
|
||||
<object class="NSColor" key="IBUITextColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MQA</bytes>
|
||||
</object>
|
||||
<nil key="IBUIHighlightedColor"/>
|
||||
<int key="IBUIBaselineAdjustment">1</int>
|
||||
<float key="IBUIMinimumFontSize">1.000000e+01</float>
|
||||
<int key="IBUITextAlignment">1</int>
|
||||
</object>
|
||||
<object class="IBUIActivityIndicatorView" id="903353680">
|
||||
<reference key="NSNextResponder" ref="715980885"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{141, 235}, {37, 37}}</string>
|
||||
<reference key="NSSuperview" ref="715980885"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<bool key="IBUIUserInteractionEnabled">NO</bool>
|
||||
<bool key="IBUIHidesWhenStopped">NO</bool>
|
||||
<int key="IBUIStyle">0</int>
|
||||
</object>
|
||||
</object>
|
||||
<string key="NSFrameSize">{320, 480}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MCAwIDAgMC41AA</bytes>
|
||||
</object>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<bool key="IBUIUserInteractionEnabled">NO</bool>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<object class="NSMutableArray" key="connectionRecords">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">delegate</string>
|
||||
<reference key="source" ref="841351856"/>
|
||||
<reference key="destination" ref="664661524"/>
|
||||
</object>
|
||||
<int key="connectionID">4</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">viewController</string>
|
||||
<reference key="source" ref="664661524"/>
|
||||
<reference key="destination" ref="943309135"/>
|
||||
</object>
|
||||
<int key="connectionID">11</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">window</string>
|
||||
<reference key="source" ref="664661524"/>
|
||||
<reference key="destination" ref="117978783"/>
|
||||
</object>
|
||||
<int key="connectionID">14</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">hudView</string>
|
||||
<reference key="source" ref="453364069"/>
|
||||
<reference key="destination" ref="715980885"/>
|
||||
</object>
|
||||
<int key="connectionID">22</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">hudBox</string>
|
||||
<reference key="source" ref="453364069"/>
|
||||
<reference key="destination" ref="489581855"/>
|
||||
</object>
|
||||
<int key="connectionID">23</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">label</string>
|
||||
<reference key="source" ref="453364069"/>
|
||||
<reference key="destination" ref="591361543"/>
|
||||
</object>
|
||||
<int key="connectionID">24</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">loadingIndicator</string>
|
||||
<reference key="source" ref="453364069"/>
|
||||
<reference key="destination" ref="903353680"/>
|
||||
</object>
|
||||
<int key="connectionID">25</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">startupViewController</string>
|
||||
<reference key="source" ref="664661524"/>
|
||||
<reference key="destination" ref="453364069"/>
|
||||
</object>
|
||||
<int key="connectionID">26</int>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<object class="NSArray" key="orderedObjects">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<object class="NSArray" key="object" id="957960031">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="841351856"/>
|
||||
<reference key="parent" ref="957960031"/>
|
||||
<string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">3</int>
|
||||
<reference key="object" ref="664661524"/>
|
||||
<reference key="parent" ref="957960031"/>
|
||||
<string key="objectName">CrashReporterDemo App Delegate</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="427554174"/>
|
||||
<reference key="parent" ref="957960031"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">10</int>
|
||||
<reference key="object" ref="943309135"/>
|
||||
<reference key="parent" ref="957960031"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">12</int>
|
||||
<reference key="object" ref="117978783"/>
|
||||
<reference key="parent" ref="957960031"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">15</int>
|
||||
<reference key="object" ref="453364069"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="715980885"/>
|
||||
</object>
|
||||
<reference key="parent" ref="957960031"/>
|
||||
<string key="objectName">StartupController</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">17</int>
|
||||
<reference key="object" ref="715980885"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="903353680"/>
|
||||
<reference ref="591361543"/>
|
||||
<reference ref="489581855"/>
|
||||
</object>
|
||||
<reference key="parent" ref="453364069"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">19</int>
|
||||
<reference key="object" ref="903353680"/>
|
||||
<reference key="parent" ref="715980885"/>
|
||||
<string key="objectName">Activity indicator</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">20</int>
|
||||
<reference key="object" ref="591361543"/>
|
||||
<reference key="parent" ref="715980885"/>
|
||||
<string key="objectName">Header text</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">21</int>
|
||||
<reference key="object" ref="489581855"/>
|
||||
<reference key="parent" ref="715980885"/>
|
||||
<string key="objectName">Box</string>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="flattenedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>-1.CustomClassName</string>
|
||||
<string>-2.CustomClassName</string>
|
||||
<string>10.CustomClassName</string>
|
||||
<string>10.IBEditorWindowLastContentRect</string>
|
||||
<string>10.IBPluginDependency</string>
|
||||
<string>12.IBEditorWindowLastContentRect</string>
|
||||
<string>12.IBPluginDependency</string>
|
||||
<string>15.CustomClassName</string>
|
||||
<string>15.IBEditorWindowLastContentRect</string>
|
||||
<string>15.IBPluginDependency</string>
|
||||
<string>17.IBPluginDependency</string>
|
||||
<string>19.IBPluginDependency</string>
|
||||
<string>20.IBPluginDependency</string>
|
||||
<string>21.CustomClassName</string>
|
||||
<string>21.IBPluginDependency</string>
|
||||
<string>3.CustomClassName</string>
|
||||
<string>3.IBPluginDependency</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>UIApplication</string>
|
||||
<string>UIResponder</string>
|
||||
<string>CrashReporterDemoViewController</string>
|
||||
<string>{{512, 351}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>{{525, 346}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>StartupViewController</string>
|
||||
<string>{{1295, 479}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>HudView</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>CrashReporterDemoAppDelegate</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="unlocalizedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="activeLocalization"/>
|
||||
<object class="NSMutableDictionary" key="localizations">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">26</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">CrashReporterDemoAppDelegate</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>startupViewController</string>
|
||||
<string>viewController</string>
|
||||
<string>window</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>StartupViewController</string>
|
||||
<string>CrashReporterDemoViewController</string>
|
||||
<string>UIWindow</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/CrashReporterDemoAppDelegate.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">CrashReporterDemoAppDelegate</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBUserSource</string>
|
||||
<string key="minorKey"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">CrashReporterDemoViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>triggerCrash</string>
|
||||
<string>triggerMemoryLeak</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>id</string>
|
||||
<string>id</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>triggerButtonCrash</string>
|
||||
<string>triggerButtonMemoryLeak</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>UIButton</string>
|
||||
<string>UIButton</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/CrashReporterDemoViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">HudView</string>
|
||||
<string key="superclassName">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/HudView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">HudView</string>
|
||||
<string key="superclassName">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBUserSource</string>
|
||||
<string key="minorKey"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">StartupViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSMutableArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>hudBox</string>
|
||||
<string>hudView</string>
|
||||
<string>label</string>
|
||||
<string>loadingIndicator</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>HudView</string>
|
||||
<string>UIView</string>
|
||||
<string>UILabel</string>
|
||||
<string>UIActivityIndicatorView</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/StartupViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">StartupViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBUserSource</string>
|
||||
<string key="minorKey"/>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.LastKnownRelativeProjectPath">CrashReporterDemo.xcodeproj</string>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
</data>
|
||||
</archive>
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2009 Andreas Linde. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
These are the main features of this demo project:
|
||||
- (Automatically) send crash reports to a developers database
|
||||
- Let the user decide per crash to send data or always
|
||||
- The user has the option to provide additional information in the settings, like email address for contacting the user
|
||||
- Give the user immediate feedback if the crash is known and will be fixed in the next update, or if the update is already waiting at Apple for approval, or if the update is already available to install
|
||||
|
||||
These are the main features on backend side for the developer:
|
||||
- Maintain app versions and their status in a table (upcoming, in approval, available, ...)
|
||||
- Maintain crash reports and sort them by using simple patterns. Automatically know how many times a bug has occured and easily filter the new ones in the DB
|
||||
- Assign bugfix versions for each bug pattern
|
||||
|
||||
Server side files:
|
||||
- database.txt contains all the default tables
|
||||
- crash.php is the file that is invoked by the iPhone app
|
||||
- crash_update.php has to be invoked once a new pattern has been added, so the non-checked bug reports are processed and assigned to the new pattern if they match
|
||||
|
||||
Feel free to add enhancements, maybe even a web front-end for managing the data in the database and provide them back to the community!
|
||||
|
||||
Thanks
|
||||
Andreas Linde
|
||||
http://www.andreaslinde.com/
|
||||
http://www.buzzworks.de/
|
|
@ -1,27 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string> </string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSChildPaneSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>SettingsCrashTitle</string>
|
||||
<key>File</key>
|
||||
<string>bugdata</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>StringsTable</key>
|
||||
<string>Root</string>
|
||||
<key>Title</key>
|
||||
<string>Crash Reporter Demo</string>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1,55 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Title</key>
|
||||
<string>Bug data</string>
|
||||
<key>StringsTable</key>
|
||||
<string>bugdata</string>
|
||||
<key>PreferenceSpecifiers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSToggleSwitchSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>SettingsAutoSendCrash</string>
|
||||
<key>Key</key>
|
||||
<string>AutoSendCrashDataKey</string>
|
||||
<key>DefaultValue</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>SettingsAutoSendCrashDescription</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSToggleSwitchSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>SettingsAllowContact</string>
|
||||
<key>Key</key>
|
||||
<string>CrashDataContactAllowKey</string>
|
||||
<key>DefaultValue</key>
|
||||
<false/>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSTextFieldSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>SettingsContactEmail</string>
|
||||
<key>Key</key>
|
||||
<string>CrashDataContactEmailKey</string>
|
||||
<key>KeyboardType</key>
|
||||
<string>EmailAddress</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
<key>Title</key>
|
||||
<string>SettingsContactDescription</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1,5 +0,0 @@
|
|||
|
||||
/* Settings */
|
||||
|
||||
/* What to do in case of crashes */
|
||||
"SettingsCrashTitle" = "Fehlerbericht";
|
Двоичный файл не отображается.
|
@ -1,5 +0,0 @@
|
|||
|
||||
/* Settings */
|
||||
|
||||
/* What to do in case of crashes */
|
||||
"SettingsCrashTitle" = "Bug report";
|
|
@ -1,15 +0,0 @@
|
|||
|
||||
/* Settings title if crash data might be sent to the developer automatically */
|
||||
"SettingsAutoSendCrash" = "Automatic report";
|
||||
|
||||
/* Description text for automatic sending of crash data */
|
||||
"SettingsAutoSendCrashDescription" = "If a crash appears, the data would be sent to the developer automatically without asking the users.";
|
||||
|
||||
/* Allow the developer to contact the user via email */
|
||||
"SettingsAllowContact" = "Allow contact";
|
||||
|
||||
/* Email address the developer might use */
|
||||
"SettingsContactEmail" = "EMail address";
|
||||
|
||||
/* Description text for email contact usage */
|
||||
"SettingsContactDescription" = "The email address would only be used to contact the user if there might be more clarifications needed about the problem";
|
|
@ -1,5 +0,0 @@
|
|||
|
||||
/* Settings */
|
||||
|
||||
/* What to do in case of crashes */
|
||||
"SettingsCrashTitle" = "Informe de error";
|
|
@ -1,15 +0,0 @@
|
|||
|
||||
/* Settings title if crash data might be sent to the developer automatically */
|
||||
"SettingsAutoSendCrash" = "Automática de informes";
|
||||
|
||||
/* Description text for automatic sending of crash data */
|
||||
"SettingsAutoSendCrashDescription" = "Si aparece un accidente, los datos serían enviados automáticamente a los desarrolladores sin pedir a los usuarios.";
|
||||
|
||||
/* Allow the developer to contact the user via email */
|
||||
"SettingsAllowContact" = "Permitir el contacto";
|
||||
|
||||
/* Email address the developer might use */
|
||||
"SettingsContactEmail" = "EMail";
|
||||
|
||||
/* Description text for email contact usage */
|
||||
"SettingsContactDescription" = "La dirección de correo electrónico sólo se utiliza para ponerse en contacto con el usuario si puede haber más aclaraciones necesarias sobre el problema";
|
|
@ -1,7 +0,0 @@
|
|||
|
||||
/* Settings */
|
||||
|
||||
/* What to do in case of crashes */
|
||||
"SettingsCrashTitle" = "Virhetiedot";
|
||||
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
|
||||
/* Settings title if crash data might be sent to the developer automatically */
|
||||
"SettingsAutoSendCrash" = "Automaatt. ilmoitus";
|
||||
|
||||
/* Description text for automatic sending of crash data */
|
||||
"SettingsAutoSendCrashDescription" = "Jos ohjelma kaatuu, tiedot lähetetään kehittäjälle ilman luvan kysymistä käyttäjältä.";
|
||||
|
||||
/* Allow the developer to contact the user via email */
|
||||
"SettingsAllowContact" = "Salli yhteyshenkilö";
|
||||
|
||||
/* Email address the developer might use */
|
||||
"SettingsContactEmail" = "Sähköp. osoite";
|
||||
|
||||
/* Description text for email contact usage */
|
||||
"SettingsContactDescription" = "Tätä sähköpostiosoitetta käytetään vain, jos kehittäjä tarvitsee lisää tietoja ongelmasta.";
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче