1053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown/*
2053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * Copyright (C) 2012 The Android Open Source Project
3053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown *
4053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * you may not use this file except in compliance with the License.
6053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * You may obtain a copy of the License at
7053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown *
8053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown *
10053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * Unless required by applicable law or agreed to in writing, software
11053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * See the License for the specific language governing permissions and
14053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * limitations under the License.
15053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown */
16053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
17053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#ifndef __CUTILS_DEBUGGER_H
18053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#define __CUTILS_DEBUGGER_H
19053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
20053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include <sys/types.h>
21053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
22053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#ifdef __cplusplus
23053b865412d1982ad1dc0e840898d82527deeb99Jeff Brownextern "C" {
24053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#endif
25053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
26a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#define DEBUGGER32_SOCKET_NAME "android:debuggerd"
27a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#define DEBUGGER64_SOCKET_NAME "android:debuggerd64"
28a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris
29a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#if defined(__LP64__)
30a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#define DEBUGGER_SOCKET_NAME DEBUGGER64_SOCKET_NAME
31e9edf7a0efd8c62dacab7bf765c8037d8a94c3bbElliott Hughes#else
32a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#define DEBUGGER_SOCKET_NAME DEBUGGER32_SOCKET_NAME
33e9edf7a0efd8c62dacab7bf765c8037d8a94c3bbElliott Hughes#endif
34053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
35053b865412d1982ad1dc0e840898d82527deeb99Jeff Browntypedef enum {
36053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    // dump a crash
37053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    DEBUGGER_ACTION_CRASH,
38053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    // dump a tombstone file
39053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    DEBUGGER_ACTION_DUMP_TOMBSTONE,
40053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    // dump a backtrace only back to the socket
41053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    DEBUGGER_ACTION_DUMP_BACKTRACE,
42053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown} debugger_action_t;
43053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
44053b865412d1982ad1dc0e840898d82527deeb99Jeff Browntypedef struct {
45053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    debugger_action_t action;
46053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    pid_t tid;
47707b8bbe1800dbebd932f54e86347563ee86c36eElliott Hughes    uintptr_t abort_msg_address;
48855fcc3114c20ff9fd286fe1723d1413fec9685aElliott Hughes    int32_t original_si_code;
49053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown} debugger_msg_t;
50053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
51a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#if defined(__LP64__)
52a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris// For a 64 bit process to contact the 32 bit debuggerd.
53a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferristypedef struct {
54a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris    debugger_action_t action;
55a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris    pid_t tid;
56a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris    uint32_t abort_msg_address;
57a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris    int32_t original_si_code;
58a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris} debugger32_msg_t;
59a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris#endif
60a9fa7b87f1aefd7b96f749a545d3385ad384c12bChristopher Ferris
61053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown/* Dumps a process backtrace, registers, and stack to a tombstone file (requires root).
62053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * Stores the tombstone path in the provided buffer.
63053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * Returns 0 on success, -1 on error.
64053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown */
65053b865412d1982ad1dc0e840898d82527deeb99Jeff Brownint dump_tombstone(pid_t tid, char* pathbuf, size_t pathlen);
66053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
675f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris/* Dumps a process backtrace, registers, and stack to a tombstone file (requires root).
685f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * Stores the tombstone path in the provided buffer.
695f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * If reading debugger data from debuggerd ever takes longer than timeout_secs
705f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * seconds, then stop and return an error.
715f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * Returns 0 on success, -1 on error.
725f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris */
735f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferrisint dump_tombstone_timeout(pid_t tid, char* pathbuf, size_t pathlen, int timeout_secs);
745f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris
75053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown/* Dumps a process backtrace only to the specified file (requires root).
76053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown * Returns 0 on success, -1 on error.
77053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown */
78053b865412d1982ad1dc0e840898d82527deeb99Jeff Brownint dump_backtrace_to_file(pid_t tid, int fd);
79053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
805f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris/* Dumps a process backtrace only to the specified file (requires root).
815f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * If reading debugger data from debuggerd ever takes longer than timeout_secs
825f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * seconds, then stop and return an error.
835f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris * Returns 0 on success, -1 on error.
845f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris */
855f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferrisint dump_backtrace_to_file_timeout(pid_t tid, int fd, int timeout_secs);
865f2ff6a9106083e2a79b8600a0bf6a5341c6ca38Christopher Ferris
87053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#ifdef __cplusplus
88053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown}
89053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#endif
90053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
91053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#endif /* __CUTILS_DEBUGGER_H */
92