mirror of
https://github.com/yuzu-emu/breakpad.git
synced 2024-11-24 18:45:37 +01:00
Now we provide our own implementation of the MIG function exc_server, as recommended by Apple.
See http://groups.google.com/group/google-breakpad-dev/browse_thread/thread/8b363b1f8a404714 For more information git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@282 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
2d7664e8d4
commit
85534c2eaf
1750
src/client/mac/handler/breakpad_exc_server.c
Normal file
1750
src/client/mac/handler/breakpad_exc_server.c
Normal file
File diff suppressed because it is too large
Load Diff
258
src/client/mac/handler/breakpad_exc_server.h
Normal file
258
src/client/mac/handler/breakpad_exc_server.h
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
#ifndef _exc_user_
|
||||||
|
#define _exc_user_
|
||||||
|
|
||||||
|
/* Module exc */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <mach/ndr.h>
|
||||||
|
#include <mach/boolean.h>
|
||||||
|
#include <mach/kern_return.h>
|
||||||
|
#include <mach/notify.h>
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
#include <mach/message.h>
|
||||||
|
#include <mach/mig_errors.h>
|
||||||
|
#include <mach/port.h>
|
||||||
|
|
||||||
|
#ifdef AUTOTEST
|
||||||
|
#ifndef FUNCTION_PTR_T
|
||||||
|
#define FUNCTION_PTR_T
|
||||||
|
typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t);
|
||||||
|
typedef struct {
|
||||||
|
char *name;
|
||||||
|
function_ptr_t function;
|
||||||
|
} function_table_entry;
|
||||||
|
typedef function_table_entry *function_table_t;
|
||||||
|
#endif /* FUNCTION_PTR_T */
|
||||||
|
#endif /* AUTOTEST */
|
||||||
|
|
||||||
|
#ifndef exc_MSG_COUNT
|
||||||
|
#define exc_MSG_COUNT 3
|
||||||
|
#endif /* exc_MSG_COUNT */
|
||||||
|
|
||||||
|
#include <mach/std_types.h>
|
||||||
|
#include <mach/mig.h>
|
||||||
|
#include <mach/mig.h>
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
|
||||||
|
#ifdef __BeforeMigUserHeader
|
||||||
|
__BeforeMigUserHeader
|
||||||
|
#endif /* __BeforeMigUserHeader */
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Routine exception_raise */
|
||||||
|
#ifdef mig_external
|
||||||
|
mig_external
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif /* mig_external */
|
||||||
|
kern_return_t exception_raise
|
||||||
|
(
|
||||||
|
mach_port_t exception_port,
|
||||||
|
mach_port_t thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Routine exception_raise_state */
|
||||||
|
#ifdef mig_external
|
||||||
|
mig_external
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif /* mig_external */
|
||||||
|
kern_return_t exception_raise_state
|
||||||
|
(
|
||||||
|
mach_port_t exception_port,
|
||||||
|
exception_type_t exception,
|
||||||
|
const exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt,
|
||||||
|
int *flavor,
|
||||||
|
const thread_state_t old_state,
|
||||||
|
mach_msg_type_number_t old_stateCnt,
|
||||||
|
thread_state_t new_state,
|
||||||
|
mach_msg_type_number_t *new_stateCnt
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Routine exception_raise_state_identity */
|
||||||
|
#ifdef mig_external
|
||||||
|
mig_external
|
||||||
|
#else
|
||||||
|
extern
|
||||||
|
#endif /* mig_external */
|
||||||
|
kern_return_t exception_raise_state_identity
|
||||||
|
(
|
||||||
|
mach_port_t exception_port,
|
||||||
|
mach_port_t thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt,
|
||||||
|
int *flavor,
|
||||||
|
thread_state_t old_state,
|
||||||
|
mach_msg_type_number_t old_stateCnt,
|
||||||
|
thread_state_t new_state,
|
||||||
|
mach_msg_type_number_t *new_stateCnt
|
||||||
|
);
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
/********************** Caution **************************/
|
||||||
|
/* The following data types should be used to calculate */
|
||||||
|
/* maximum message sizes only. The actual message may be */
|
||||||
|
/* smaller, and the position of the arguments within the */
|
||||||
|
/* message layout may vary from what is presented here. */
|
||||||
|
/* For example, if any of the arguments are variable- */
|
||||||
|
/* sized, and less than the maximum is sent, the data */
|
||||||
|
/* will be packed tight in the actual message to reduce */
|
||||||
|
/* the presence of holes. */
|
||||||
|
/********************** Caution **************************/
|
||||||
|
|
||||||
|
/* typedefs for all requests */
|
||||||
|
|
||||||
|
#ifndef __Request__exc_subsystem__defined
|
||||||
|
#define __Request__exc_subsystem__defined
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
/* start of the kernel processed data */
|
||||||
|
mach_msg_body_t msgh_body;
|
||||||
|
mach_msg_port_descriptor_t thread;
|
||||||
|
mach_msg_port_descriptor_t task;
|
||||||
|
/* end of the kernel processed data */
|
||||||
|
NDR_record_t NDR;
|
||||||
|
exception_type_t exception;
|
||||||
|
mach_msg_type_number_t codeCnt;
|
||||||
|
integer_t code[2];
|
||||||
|
} __Request__exception_raise_t;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
NDR_record_t NDR;
|
||||||
|
exception_type_t exception;
|
||||||
|
mach_msg_type_number_t codeCnt;
|
||||||
|
integer_t code[2];
|
||||||
|
int flavor;
|
||||||
|
mach_msg_type_number_t old_stateCnt;
|
||||||
|
natural_t old_state[144];
|
||||||
|
} __Request__exception_raise_state_t;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
/* start of the kernel processed data */
|
||||||
|
mach_msg_body_t msgh_body;
|
||||||
|
mach_msg_port_descriptor_t thread;
|
||||||
|
mach_msg_port_descriptor_t task;
|
||||||
|
/* end of the kernel processed data */
|
||||||
|
NDR_record_t NDR;
|
||||||
|
exception_type_t exception;
|
||||||
|
mach_msg_type_number_t codeCnt;
|
||||||
|
integer_t code[2];
|
||||||
|
int flavor;
|
||||||
|
mach_msg_type_number_t old_stateCnt;
|
||||||
|
natural_t old_state[144];
|
||||||
|
} __Request__exception_raise_state_identity_t;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
#endif /* !__Request__exc_subsystem__defined */
|
||||||
|
|
||||||
|
/* union of all requests */
|
||||||
|
|
||||||
|
#ifndef __RequestUnion__exc_subsystem__defined
|
||||||
|
#define __RequestUnion__exc_subsystem__defined
|
||||||
|
union __RequestUnion__exc_subsystem {
|
||||||
|
__Request__exception_raise_t Request_exception_raise;
|
||||||
|
__Request__exception_raise_state_t Request_exception_raise_state;
|
||||||
|
__Request__exception_raise_state_identity_t Request_exception_raise_state_identity;
|
||||||
|
};
|
||||||
|
#endif /* !__RequestUnion__exc_subsystem__defined */
|
||||||
|
/* typedefs for all replies */
|
||||||
|
|
||||||
|
#ifndef __Reply__exc_subsystem__defined
|
||||||
|
#define __Reply__exc_subsystem__defined
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
NDR_record_t NDR;
|
||||||
|
kern_return_t RetCode;
|
||||||
|
} __Reply__exception_raise_t;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
NDR_record_t NDR;
|
||||||
|
kern_return_t RetCode;
|
||||||
|
int flavor;
|
||||||
|
mach_msg_type_number_t new_stateCnt;
|
||||||
|
natural_t new_state[144];
|
||||||
|
} __Reply__exception_raise_state_t;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack(4)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
mach_msg_header_t Head;
|
||||||
|
NDR_record_t NDR;
|
||||||
|
kern_return_t RetCode;
|
||||||
|
int flavor;
|
||||||
|
mach_msg_type_number_t new_stateCnt;
|
||||||
|
natural_t new_state[144];
|
||||||
|
} __Reply__exception_raise_state_identity_t;
|
||||||
|
#ifdef __MigPackStructs
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
#endif /* !__Reply__exc_subsystem__defined */
|
||||||
|
|
||||||
|
/* union of all replies */
|
||||||
|
|
||||||
|
#ifndef __ReplyUnion__exc_subsystem__defined
|
||||||
|
#define __ReplyUnion__exc_subsystem__defined
|
||||||
|
union __ReplyUnion__exc_subsystem {
|
||||||
|
__Reply__exception_raise_t Reply_exception_raise;
|
||||||
|
__Reply__exception_raise_state_t Reply_exception_raise_state;
|
||||||
|
__Reply__exception_raise_state_identity_t Reply_exception_raise_state_identity;
|
||||||
|
};
|
||||||
|
#endif /* !__RequestUnion__exc_subsystem__defined */
|
||||||
|
|
||||||
|
#ifndef subsystem_to_name_map_exc
|
||||||
|
#define subsystem_to_name_map_exc \
|
||||||
|
{ "exception_raise", 2401 },\
|
||||||
|
{ "exception_raise_state", 2402 },\
|
||||||
|
{ "exception_raise_state_identity", 2403 }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __AfterMigUserHeader
|
||||||
|
__AfterMigUserHeader
|
||||||
|
#endif /* __AfterMigUserHeader */
|
||||||
|
|
||||||
|
#endif /* _exc_user_ */
|
@ -137,8 +137,79 @@ extern "C"
|
|||||||
mach_msg_type_number_t thread_state_count,
|
mach_msg_type_number_t thread_state_count,
|
||||||
thread_state_t thread_state,
|
thread_state_t thread_state,
|
||||||
mach_msg_type_number_t *thread_state_count);
|
mach_msg_type_number_t *thread_state_count);
|
||||||
|
|
||||||
|
kern_return_t breakpad_exception_raise_state(mach_port_t exception_port,
|
||||||
|
exception_type_t exception,
|
||||||
|
const exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt,
|
||||||
|
int *flavor,
|
||||||
|
const thread_state_t old_state,
|
||||||
|
mach_msg_type_number_t old_stateCnt,
|
||||||
|
thread_state_t new_state,
|
||||||
|
mach_msg_type_number_t *new_stateCnt
|
||||||
|
);
|
||||||
|
|
||||||
|
kern_return_t breakpad_exception_raise_state_identity(mach_port_t exception_port,
|
||||||
|
mach_port_t thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt,
|
||||||
|
int *flavor,
|
||||||
|
thread_state_t old_state,
|
||||||
|
mach_msg_type_number_t old_stateCnt,
|
||||||
|
thread_state_t new_state,
|
||||||
|
mach_msg_type_number_t *new_stateCnt
|
||||||
|
);
|
||||||
|
|
||||||
|
kern_return_t breakpad_exception_raise(mach_port_t port, mach_port_t failed_thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t code_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
kern_return_t breakpad_exception_raise_state(mach_port_t exception_port,
|
||||||
|
exception_type_t exception,
|
||||||
|
const exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt,
|
||||||
|
int *flavor,
|
||||||
|
const thread_state_t old_state,
|
||||||
|
mach_msg_type_number_t old_stateCnt,
|
||||||
|
thread_state_t new_state,
|
||||||
|
mach_msg_type_number_t *new_stateCnt
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_return_t breakpad_exception_raise_state_identity(mach_port_t exception_port,
|
||||||
|
mach_port_t thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t codeCnt,
|
||||||
|
int *flavor,
|
||||||
|
thread_state_t old_state,
|
||||||
|
mach_msg_type_number_t old_stateCnt,
|
||||||
|
thread_state_t new_state,
|
||||||
|
mach_msg_type_number_t *new_stateCnt
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return KERN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
kern_return_t breakpad_exception_raise(mach_port_t port, mach_port_t failed_thread,
|
||||||
|
mach_port_t task,
|
||||||
|
exception_type_t exception,
|
||||||
|
exception_data_t code,
|
||||||
|
mach_msg_type_number_t code_count) {
|
||||||
|
return ForwardException(task, failed_thread, exception, code, code_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ExceptionHandler::ExceptionHandler(const string &dump_path,
|
ExceptionHandler::ExceptionHandler(const string &dump_path,
|
||||||
FilterCallback filter,
|
FilterCallback filter,
|
||||||
MinidumpCallback callback,
|
MinidumpCallback callback,
|
||||||
|
@ -112,6 +112,8 @@
|
|||||||
D2F651080BEF949A00920385 /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = dynamic_images.h; sourceTree = "<group>"; };
|
D2F651080BEF949A00920385 /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = dynamic_images.h; sourceTree = "<group>"; };
|
||||||
D2F6510C0BEF94EB00920385 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
|
D2F6510C0BEF94EB00920385 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
|
||||||
D2F6510D0BEF94EB00920385 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
|
D2F6510D0BEF94EB00920385 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
F917C4F70E03265A00F86017 /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = breakpad_exc_server.c; sourceTree = "<group>"; };
|
||||||
|
F917C4F80E03265A00F86017 /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_exc_server.h; sourceTree = "<group>"; };
|
||||||
F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = "<group>"; };
|
F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = "<group>"; };
|
||||||
F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = "<group>"; };
|
F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = "<group>"; };
|
||||||
F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = "<group>"; };
|
F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = "<group>"; };
|
||||||
@ -168,6 +170,8 @@
|
|||||||
08FB7794FE84155DC02AAC07 /* MinidumpWriter */ = {
|
08FB7794FE84155DC02AAC07 /* MinidumpWriter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
F917C4F70E03265A00F86017 /* breakpad_exc_server.c */,
|
||||||
|
F917C4F80E03265A00F86017 /* breakpad_exc_server.h */,
|
||||||
F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */,
|
F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */,
|
||||||
F98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */,
|
F98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */,
|
||||||
D2F6510C0BEF94EB00920385 /* macho_walker.cc */,
|
D2F6510C0BEF94EB00920385 /* macho_walker.cc */,
|
||||||
|
Loading…
Reference in New Issue
Block a user