1e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata/* 2e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This file is part of ltrace. 34392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata * Copyright (C) 2012 Petr Machata, Red Hat Inc. 4e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2003,2008,2009 Juan Cespedes 5e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2006 Ian Wienand 6e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * 7e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This program is free software; you can redistribute it and/or 8e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * modify it under the terms of the GNU General Public License as 9e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * published by the Free Software Foundation; either version 2 of the 10e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * License, or (at your option) any later version. 11e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * 12e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This program is distributed in the hope that it will be useful, but 13e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 14e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * General Public License for more details. 16e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * 17e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * You should have received a copy of the GNU General Public License 18e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * along with this program; if not, write to the Free Software 19e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 20e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * 02110-1301 USA 21e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata */ 22e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata 23cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes#include <stdio.h> 24cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes#include <stdarg.h> 25cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes 268d1b92ba755f6d6229f5e230fc43d958b13836f8Juan Cespedes#include "common.h" 2791be87822a57bf4fb606333d5a7903dec9f56420Petr Machata#include "backend.h" 28cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes 299a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienandvoid 30cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedesdebug_(int level, const char *file, int line, const char *fmt, ...) { 31cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes char buf[1024]; 32cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes va_list args; 33cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes 34cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes if (!(options.debug & level)) { 35cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes return; 36cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes } 37cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes va_start(args, fmt); 38cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes vsnprintf(buf, 1024, fmt, args); 39cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes va_end(args); 40cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes 41cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes output_line(NULL, "DEBUG: %s:%d: %s", file, line, buf); 425d93a4189488bb80e3b6c2c6af362f9022eabe7aPetr Machata fflush(options.output); 43cac15c3f170b5ec2cc6304c8c0763a78103e1778Juan Cespedes} 449a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 45f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesstatic int 464392d965241b7ce8294d4cc53077eaa6a1132147Petr Machataxwritedump(long *ptr, arch_addr_t addr, size_t count) 474392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata{ 484392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata size_t i; 494392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata for (i = 0; i < count; ++i) { 504392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata if (fprintf(stderr, "%p->%0*lx\n", 514392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata addr, 2 * (int)sizeof(long), ptr[i]) < 0) 524392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata return -1; 532d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand addr += sizeof(long); 542d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand } 552d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand 564392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata return 0; 579a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand} 589a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand 59f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesint 60929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataxinfdump(struct process *proc, arch_addr_t addr, size_t length) 6191be87822a57bf4fb606333d5a7903dec9f56420Petr Machata{ 624392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata unsigned char buf[length]; 634392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata size_t got = umovebytes(proc, addr, buf, length); 6491be87822a57bf4fb606333d5a7903dec9f56420Petr Machata if (got == (size_t)-1) 6591be87822a57bf4fb606333d5a7903dec9f56420Petr Machata return -1; 664392d965241b7ce8294d4cc53077eaa6a1132147Petr Machata return xwritedump((long *)buf, addr, got / sizeof(long)); 679a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand} 68