ptrace.h revision 501edd29b823ce1301d2effdd3a9e4b6e2b20b76
1501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
2501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Copyright (C) 2011 The Android Open Source Project
3501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
4501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * you may not use this file except in compliance with the License.
6501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * You may obtain a copy of the License at
7501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
8501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
10501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Unless required by applicable law or agreed to in writing, software
11501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * See the License for the specific language governing permissions and
14501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * limitations under the License.
15501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
16501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
17501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Useful ptrace() utility functions. */
18501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
19501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifndef _CORKSCREW_PTRACE_H
20501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#define _CORKSCREW_PTRACE_H
21501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
22501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <corkscrew/map_info.h>
23501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <corkscrew/symbol_table.h>
24501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
25501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <sys/types.h>
26501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <stdbool.h>
27501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
28501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifdef __cplusplus
29501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownextern "C" {
30501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
31501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
32501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Stores information about a process that is used for several different
33501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * ptrace() based operations. */
34501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Browntypedef struct {
35501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    map_info_t* map_info_list;
36501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} ptrace_context_t;
37501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
38501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#if __i386__
39501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* ptrace() register context. */
40501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Browntypedef struct pt_regs_x86 {
41501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t ebx;
42501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t ecx;
43501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t edx;
44501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t esi;
45501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t edi;
46501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t ebp;
47501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t eax;
48501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xds;
49501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xes;
50501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xfs;
51501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xgs;
52501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t orig_eax;
53501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t eip;
54501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xcs;
55501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t eflags;
56501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t esp;
57501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xss;
58501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} pt_regs_x86_t;
59501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
60501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
61501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
62501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Reads a word of memory safely.
63501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Uses ptrace() if tid >= 0, local memory otherwise.
64501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Returns false if the word could not be read.
65501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
66501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownbool try_get_word(pid_t tid, uintptr_t ptr, uint32_t* out_value);
67501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
68501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
69501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Loads information needed for examining a remote process using ptrace().
70501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * The caller must already have successfully attached to the process
71501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * using ptrace().
72501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
73501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * The context can be used for any threads belonging to that process
74501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * assuming ptrace() is attached to them before performing the actual
75501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * unwinding.  The context can continue to be used to decode backtraces
76501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * even after ptrace() has been detached from the process.
77501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
78501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownptrace_context_t* load_ptrace_context(pid_t pid);
79501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
80501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
81501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Frees a ptrace context.
82501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
83501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid free_ptrace_context(ptrace_context_t* context);
84501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
85501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
86501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Finds a symbol using ptrace.
87501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Returns the containing map and information about the symbol, or
88501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * NULL if one or the other is not available.
89501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
90501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid find_symbol_ptrace(const ptrace_context_t* context,
91501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown        uintptr_t addr, const map_info_t** out_map_info, const symbol_t** out_symbol);
92501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
93501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifdef __cplusplus
94501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown}
95501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
96501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
97501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif // _CORKSCREW_PTRACE_H
98