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