diff --git a/src/google/airbag_types.h b/src/google/airbag_types.h new file mode 100644 index 00000000..758b09ed --- /dev/null +++ b/src/google/airbag_types.h @@ -0,0 +1,46 @@ +/* Copyright (C) 2006 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ + +/* airbag_types.h: Precise-width types + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file ensures that types u_intN_t are defined for N = 8, 16, 32, and + * 64. Types of precise widths are crucial to the task of writing data + * structures on one platform and reading them on another. + * + * Author: Mark Mentovai */ + +#ifndef _AIRBAG_TYPES_H__ +#define _AIRBAG_TYPES_H__ + + +#ifndef _WIN32 + +#include + +#else /* !_WIN32 */ + +#include + +typedef unsigned __int8 u_int8_t; +typedef unsigned __int16 u_int16_t; +typedef unsigned __int32 u_int32_t; +typedef unsigned __int64 u_int64_t; + +#endif /* !_WIN32 */ + +typedef u_int64_t airbag_time_t; + +#endif /* _AIRBAG_TYPES_H__ */ diff --git a/src/google/crash_report.h b/src/google/crash_report.h new file mode 100644 index 00000000..dd4bc916 --- /dev/null +++ b/src/google/crash_report.h @@ -0,0 +1,86 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// CrashReport encapsulates all of the information for a single report, +// including data sent with the report and data derived by the minidump +// processor (stack trace, etc.). + +#ifndef _CRASH_REPORT_H__ +#define _CRASH_REPORT_H__ + +#include +#include +#include "airbag_types.h" +#include "stack_frame.h" + +namespace google_airbag { + +using std::vector; +using std::string; + +struct CrashReport { + // An optional id for the report. This is supplied by the caller + // and is not used by airbag. + u_int64_t report_id; + + // The time that the report was uploaded (milliseconds since the epoch) + airbag_time_t report_time; + + // The uptime of the process before it crashed + airbag_time_t process_uptime; + + // The cumulative uptime of the application for this user + airbag_time_t cumulative_product_uptime; + + // The user's email address, if they provided it + string user_email; + + // Extra comments the user provided, e.g. steps to reproduce the crash + string user_comments; + + // The product which sent this report + struct Product { + string name; + string version; + }; + Product product; + + // The user's operating system + struct OS { + string name; + string version; + }; + OS os; + + // The user's CPU architecture (x86, PowerPC, x86_64, ...) + string cpu_arch; + + // Extra product-specific key/value pairs + struct ProductData { + string key; + string value; + }; + vector product_data; + + // The stack frames for the crashed thread, top-first.m + // TODO(bryner): accommodate multiple threads + StackFrames stack_frames; + + // The stack trace "signature", which can be used for matching up reports + string stack_signature; +}; + +} // namespace google_airbag + +#endif // _CRASH_REPORT_H__ diff --git a/src/google/stack_frame.h b/src/google/stack_frame.h new file mode 100644 index 00000000..1d06c972 --- /dev/null +++ b/src/google/stack_frame.h @@ -0,0 +1,58 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef _STACK_FRAME_H__ +#define _STACK_FRAME_H__ + +#include +#include "airbag_types.h" + +namespace google_airbag { + +using std::string; + +struct StackFrame { + // The program counter location relative to the module base + u_int64_t instruction; + + // The frame pointer to this stack frame + u_int64_t frame_pointer; + + // The base address of the module + u_int64_t module_base; + + // The module in which the pc resides + string module_name; + + // The start address of the function, may be omitted if debug symbols + // are not available. + u_int64_t function_base; + + // The function name, may be omitted if debug symbols are not available + string function_name; + + // The source file name, may be omitted if debug symbols are not available + string source_file_name; + + // The source line number, may be omitted if debug symbols are not available + int source_line; + + // TODO(bryner): saved registers +}; + +typedef std::vector StackFrames; + +} // namespace google_airbag + +#endif // _STACK_FRAME_H__