ftmemsim-valgrind/coregrind/pub_core_execontext.h
Philippe Waroquiers 6bd8cf1eae Addition of GDB server monitor command 'v.info execontext' that shows
information about the stack traces recorded by Valgrind.
This can be used to analyse one possible cause of Valgrind high
memory usage for some programs.

At work, a big set of regression tests crashed out of memory under Valgrind.

Two main causes for out of memory were identified:
1. big memory usage for stacktrace (exe contexts) recording by Valgrind
2. big number of partially initialised bytes.

This patch adds a gdbsrv monitor command that output (very) detailed
information about all the recorded exe context.

This has been used to analyse the problem 1. above,
showing the following identified causes for a (too) big nr of execontexts:

A. When the JIT handles an unknown SP update, even when --track-origins=no,
an execontext is (uselessly) created and recorded
to track the (never used) origin of some uninitialised stack memory.
This creates a whole bunch of 'one IP' execontexts.

B. same problem in handling some system calls (at least the brk system
 calls always records an origin, even when --track-origins=yes).

C. The Valgrind unwinder cannot properly unwind some stack traces.
  It unwinds a few frames, then go bezerk and stops at a "random" IP.
  This then causes the same "logical" stacktrace to be truncated
  and records thousands of times with this "differentiating" last IP.


For problem cause 2 above ( a lot of partially initialised bytes),
the idea is to similarly add another gdbsrv commands that will output
statistics about which stack traces are causing a lot of uninitialised bytes. 




git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13220
2013-01-10 20:42:51 +00:00

63 lines
2.4 KiB
C

/*--------------------------------------------------------------------*/
/*--- ExeContexts: long-lived, non-dup'd stack traces. ---*/
/*--- pub_core_execontext.h ---*/
/*--------------------------------------------------------------------*/
/*
This file is part of Valgrind, a dynamic binary instrumentation
framework.
Copyright (C) 2000-2012 Julian Seward
jseward@acm.org
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307, USA.
The GNU General Public License is contained in the file COPYING.
*/
#ifndef __PUB_CORE_EXECONTEXT_H
#define __PUB_CORE_EXECONTEXT_H
//--------------------------------------------------------------------
// PURPOSE: This module provides an abstract data type, ExeContext,
// which is a stack trace stored in such a way that duplicates are
// avoided. This also facilitates fast comparisons if necessary.
//--------------------------------------------------------------------
#include "pub_tool_execontext.h"
/* The maximum number of calls we're prepared to save in an ExeContext. */
#define VG_DEEPEST_BACKTRACE 500
// Print stats (informational only).
// If with_stacktraces, outputs all the recorded stacktraces.
extern void VG_(print_ExeContext_stats) ( Bool with_stacktraces );
// Extract the StackTrace from an ExeContext.
// (Minor hack: we use Addr* as the return type instead of StackTrace so
// that modules #including this file don't also have to #include
// pub_core_stacktrace.h also.)
extern
/*StackTrace*/Addr* VG_(get_ExeContext_StackTrace) ( ExeContext* e );
#endif // __PUB_CORE_EXECONTEXT_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/