19294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata/* 29294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * This file is part of ltrace. 356134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * Copyright (C) 2012,2013,2014 Petr Machata, Red Hat Inc. 49294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * Copyright (C) 2009 Juan Cespedes 59294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 69294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * This program is free software; you can redistribute it and/or 79294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * modify it under the terms of the GNU General Public License as 89294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * published by the Free Software Foundation; either version 2 of the 99294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * License, or (at your option) any later version. 109294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 119294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * This program is distributed in the hope that it will be useful, but 129294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 139294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 149294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * General Public License for more details. 159294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 169294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * You should have received a copy of the GNU General Public License 179294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * along with this program; if not, write to the Free Software 189294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 199294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 02110-1301 USA 209294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata */ 219294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 229294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#ifndef BREAKPOINT_H 239294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#define BREAKPOINT_H 249294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 259294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata/* XXX This is currently a very weak abstraction. We would like to 269294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * much expand this to allow things like breakpoints on SDT probes and 279294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * such. 289294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 299294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * In particular, we would like to add a tracepoint abstraction. 309294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * Tracepoint is a traceable feature--e.g. an exact address, a DWARF 319294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * symbol, an ELF symbol, a PLT entry, or an SDT probe. Tracepoints 329294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * are named and the user can configure which of them he wants to 339294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * enable. Realized tracepoints enable breakpoints, which are a 349294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * low-level realization of high-level tracepoint. 359294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 360c3377e8d516bbb8b053ca92a2bb68dc65a64288Petr Machata * Service breakpoints like the handling of dlopen would be a 370c3377e8d516bbb8b053ca92a2bb68dc65a64288Petr Machata * low-level breakpoint, likely without tracepoint attached. 389294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * 399294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata * So that's for sometimes. 409294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata */ 419294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 42d3dc17b5e87068819a780af434afaf69e63d2b50Petr Machata#include "sysdep.h" 432b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata#include "library.h" 44929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata#include "forward.h" 45a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata 46a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machatastruct bp_callbacks { 47929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata void (*on_hit)(struct breakpoint *bp, struct process *proc); 48929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata void (*on_continue)(struct breakpoint *bp, struct process *proc); 4956134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata void (*on_install)(struct breakpoint *bp, struct process *proc); 50929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata void (*on_retract)(struct breakpoint *bp, struct process *proc); 51cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata 52cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata /* Create a new breakpoint that should handle return from the 53cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * function. BP is the breakpoint that was just hit and for 54cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * which we wish to find the corresponding return breakpoint. 55cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * This returns 0 on success (in which case *RET will have 56cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * been initialized to desired breakpoint object, or NULL if 57cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * none is necessary) or a negative value on failure. */ 58cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata int (*get_return_bp)(struct breakpoint **ret, 59cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata struct breakpoint *bp, struct process *proc); 60a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata}; 619294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 629294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machatastruct breakpoint { 63a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata struct bp_callbacks *cbs; 6429add4fdf852b10ddd22cac0d1390f6d01577bc2Petr Machata struct library_symbol *libsym; 659294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata void *addr; 669294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata unsigned char orig_value[BREAKPOINT_LENGTH]; 679294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata int enabled; 682b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata struct arch_breakpoint_data arch; 699f819d5747dc2b8e0f7ac54b38dc321115de6ddaPetr Machata struct os_breakpoint_data os; 709294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata}; 719294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 722f140bfae6d45ef119ad14252c0d99c30a91d3a6Petr Machata/* Call ON_HIT handler of BP, if any is set. */ 73929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid breakpoint_on_hit(struct breakpoint *bp, struct process *proc); 74a9fd8f45e97edc629bdc218d95ce0d0a9e3de401Petr Machata 752f140bfae6d45ef119ad14252c0d99c30a91d3a6Petr Machata/* Call ON_CONTINUE handler of BP. If none is set, call 7656a9ea6b41470d5a0590f23baaff7dff99f277d5Petr Machata * continue_after_breakpoint. */ 77929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid breakpoint_on_continue(struct breakpoint *bp, struct process *proc); 7856a9ea6b41470d5a0590f23baaff7dff99f277d5Petr Machata 792f140bfae6d45ef119ad14252c0d99c30a91d3a6Petr Machata/* Call ON_RETRACT handler of BP, if any is set. This should be 8086d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * called before the breakpoints are destroyed. The reason for a 8186d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * separate interface is that breakpoint_destroy has to be callable 8286d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * without PROC. ON_DISABLE might be useful as well, but that would 8386d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * be called every time we disable the breakpoint, which is too often 8486d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * (a breakpoint has to be disabled every time that we need to execute 8586d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata * the instruction underneath it). */ 86929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid breakpoint_on_retract(struct breakpoint *bp, struct process *proc); 8756134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata 8856134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata/* Call ON_INSTALL handler of BP, if any is set. This should be 8956134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * called after the breakpoint is enabled for the first time, not 9056134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * every time it's enabled (such as after stepping over a site of a 9156134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machata * temporarily disabled breakpoint). */ 9256134ff5442bee4e128b189bb86cfc97dcb6f60aPetr Machatavoid breakpoint_on_install(struct breakpoint *bp, struct process *proc); 9386d3828129e70222abdb77bdda6f31a7f1eafd5aPetr Machata 94cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata/* Call GET_RETURN_BP handler of BP, if any is set. If none is set, 95cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * call CREATE_DEFAULT_RETURN_BP to obtain one. */ 96cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machataint breakpoint_get_return_bp(struct breakpoint **ret, 97cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata struct breakpoint *bp, struct process *proc); 98cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata 992b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata/* Initialize a breakpoint structure. That doesn't actually realize 1002b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata * the breakpoint. The breakpoint is initially assumed to be 1012b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata * disabled. orig_value has to be set separately. CBS may be 1022b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata * NULL. */ 103929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_init(struct breakpoint *bp, struct process *proc, 104bac2da505ee174b7fb984b975c5938f88f0dbab2Petr Machata arch_addr_t addr, struct library_symbol *libsym); 10555ac932f2802f85c53792153ac909dcd8a690c5cPetr Machata 106d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata/* Make a clone of breakpoint BP into the area of memory pointed to by 107e50355295eac26e15db259fbb7ff705487b501d0Petr Machata * RETP. Symbols of cloned breakpoint are looked up in NEW_PROC. 108d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata * Returns 0 on success or a negative value on failure. */ 109929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_clone(struct breakpoint *retp, struct process *new_proc, 110e50355295eac26e15db259fbb7ff705487b501d0Petr Machata struct breakpoint *bp); 111d3cc9889fdfe2e523e99ca5f664f8ae4b3936612Petr Machata 11255ac932f2802f85c53792153ac909dcd8a690c5cPetr Machata/* Set callbacks. If CBS is non-NULL, then BP->cbs shall be NULL. */ 11355ac932f2802f85c53792153ac909dcd8a690c5cPetr Machatavoid breakpoint_set_callbacks(struct breakpoint *bp, struct bp_callbacks *cbs); 1142b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata 1150fe76c64833e09b382d40ee26ba23f02c63d6eb5Petr Machata/* Destroy a breakpoint structure. */ 1168cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machatavoid breakpoint_destroy(struct breakpoint *bp); 1178cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata 11852dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata/* Call enable_breakpoint the first time it's called. Returns 0 on 11952dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * success and a negative value on failure. */ 120929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_turn_on(struct breakpoint *bp, struct process *proc); 12152dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata 12252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata/* Call disable_breakpoint when turned off the same number of times 12352dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * that it was turned on. Returns 0 on success and a negative value 12452dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * on failure. */ 125929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoint_turn_off(struct breakpoint *bp, struct process *proc); 12652dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata 127cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata/* Allocate and initialize a default return breakpoint. Returns NULL 128cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata * on failure. */ 129cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machatastruct breakpoint *create_default_return_bp(struct process *proc); 130cf98923cf77f12bef15b3f1af0c0bbd673a8e4f9Petr Machata 131dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata/* This allocates and initializes new breakpoint at ADDR, then calls 132dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * INSERT_BREAKPOINT. Returns the new breakpoint or NULL if there are 133dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * errors. */ 13402a796e5e49c147982020c78b0066930e979f3e4Petr Machatastruct breakpoint *insert_breakpoint_at(struct process *proc, arch_addr_t addr, 13502a796e5e49c147982020c78b0066930e979f3e4Petr Machata struct library_symbol *libsym); 1369294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 137dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata/* Check if there is a breakpoint on this address already. If yes, 138dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * return that breakpoint instead (BP was not added). If no, try to 139dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * PROC_ADD_BREAKPOINT and BREAKPOINT_TURN_ON. If it all works, 140dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata * return BP. Otherwise return NULL. */ 141dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machatastruct breakpoint *insert_breakpoint(struct process *proc, 142dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata struct breakpoint *bp); 143dad1b779e2ed29c9fce17853ca71cb719240b9cfPetr Machata 144e9aebd6cfb4710f96b27b5d268208ddd7f0d9eacPetr Machata/* Name of a symbol associated with BP. May be NULL. */ 145e9aebd6cfb4710f96b27b5d268208ddd7f0d9eacPetr Machataconst char *breakpoint_name(const struct breakpoint *bp); 146e9aebd6cfb4710f96b27b5d268208ddd7f0d9eacPetr Machata 14752dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata/* A library that this breakpoint comes from. May be NULL. */ 14852dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machatastruct library *breakpoint_library(const struct breakpoint *bp); 14952dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata 1508cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata/* Again, this seems to be several interfaces rolled into one: 1518cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata * - breakpoint_disable 15252dbfb161efeab85bddc880966db2f7af9b9cf9aPetr Machata * - proc_remove_breakpoint 1538cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata * - breakpoint_destroy 1548cce1193ebd35cb5a8b288bc7325cdda1b8ffe50Petr Machata * XXX */ 155b94407705ecddffd7820ee61bcad3f0d72ee87c1Petr Machatavoid delete_breakpoint_at(struct process *proc, void *addr); 156b94407705ecddffd7820ee61bcad3f0d72ee87c1Petr Machataint delete_breakpoint(struct process *proc, struct breakpoint *bp); 1579294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 1589294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata/* XXX some of the following belongs to proc.h/proc.c. */ 159929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatastruct breakpoint *address2bpstruct(struct process *proc, void *addr); 160929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatavoid disable_all_breakpoints(struct process *proc); 161929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataint breakpoints_init(struct process *proc); 1629294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata 1639294d82f67e20f5f2b61f317ad04f5cb717c7d27Petr Machata#endif /* BREAKPOINT_H */ 164