📄 valgrind_object.cpp
字号:
/* --------------------------------------------------------------------- * Implementation of class Valgrind valgrind_object.cpp * Valgrind-specific options / flags / fns * --------------------------------------------------------------------- * This file is part of Valkyrie, a front-end for Valgrind * Copyright (c) 2000-2006, OpenWorks LLP <info@open-works.co.uk> * This program is released under the terms of the GNU GPL v.2 * See the file LICENSE.GPL for the full license details. */#include "valgrind_object.h"#include "config.h" // VK_CFG_DIR, VK_SUPPS_DIR#include "vk_config.h"#include "html_urls.h"#include "memcheck_object.h"#include "cachegrind_object.h"#include "massif_object.h"#include "vk_option.h" // PERROR* and friends #include "vk_utils.h" // vk_assert, VK_DEBUG, etc./* class Valgrind ------------------------------------------------------ */Valgrind::~Valgrind(){ m_toolObjList.setAutoDelete( true ); m_toolObjList.clear();}/* these opts should be kept in exactly the same order as valgrind outputs them, as it makes keeping up-to-date a lot easier. */Valgrind::Valgrind() : VkObject( "Valgrind", "Valgrind", Qt::Key_unknown, VkObject::ID_VALGRIND ) { /* init tools */ initToolObjects(); /*--------------------------------------------------------------- */ /* tool */ addOpt( TOOL, VkOPTION::ARG_STRING, VkOPTION::WDG_COMBO, "valgrind", '\0', "tool", "<name>", "memcheck|cachegrind|massif", "memcheck", "Main tool:", "use the Valgrind tool named <name>. Available tools are: memcheck, cachegrind, massif", urlVgCore::mainTool ); /*--------------------------------------------------------------- */ /* common options relevant to all tools */ addOpt( VERBOSITY, VkOPTION::ARG_UINT, VkOPTION::WDG_SPINBOX, "valgrind", '\0', "verbosity", "<0..4>", "0|4", "1", "Verbosity level:", "Be more verbose, include counts of errors", urlVgCore::verbosity ); addOpt( TRACE_CH, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "trace-children", "<yes|no>", "yes|no", "no", "Trace child processes: ", "Valgrind-ise child processes?", urlVgCore::traceChild ); addOpt( TRACK_FDS, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "track-fds", "<yes|no>", "yes|no", "no", "Track open file descriptors:", "track open file descriptors?", urlVgCore::trackFds ); addOpt( TIME_STAMP, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "time-stamp", "<yes|no>", "yes|no", "no", "Add timestamps to log messages:", "add timestamps to log messages?", urlVgCore::timeStamp ); addOpt( LOG_FD, VkOPTION::ARG_UINT, VkOPTION::WDG_SPINBOX, "valgrind", '\0', "log-fd", "<1..1024>", "1|1023", "2", "Log to file descriptor:", "log messages to file descriptor (1=stdout, 2=stderr)", urlVgCore::logToFd ); addOpt( LOG_PID, VkOPTION::ARG_STRING, VkOPTION::WDG_LEDIT, "valgrind", '\0', "log-file", "<file>", "", "", "Log to <file>.pid<pid>:", "Log messages to <file>.pid<pid>", urlVgCore::logToFilePid ); addOpt( LOG_FILE, VkOPTION::ARG_STRING, VkOPTION::WDG_LEDIT, "valgrind", '\0', "log-file-exactly", "<file>", "", "", "Log to file:", "log messages to <file>", urlVgCore::logToFile ); addOpt( LOG_QUAL, VkOPTION::ARG_STRING, VkOPTION::WDG_NONE, "valgrind", '\0', "log-file-qualifier", "VAR", "", "", "<VAR>", "incorporate $VAR in logfile name", urlVgCore::logFileQual ); addOpt( LOG_SOCKET, VkOPTION::ARG_STRING, VkOPTION::WDG_LEDIT, "valgrind", '\0', "log-socket", "<ipaddr:port>", "", "", "Log to socket:", "log messages to socket ipaddr:port", urlVgCore::logToSocket ); /*--------------------------------------------------------------- */ /* uncommon options relevant to all tools */ addOpt( RUN_LIBC, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "run-libc-freeres", "<yes|no>", "yes|no", "yes", "Free glibc memory at exit:", "Free up glibc memory at exit?", urlVgCore::freeGlibc ); addOpt( SIM_HINTS, VkOPTION::ARG_STRING, VkOPTION::WDG_COMBO, "valgrind", '\0', "sim-hints", "<hint1,hint2,...>", "none|lax-ioctls|enable-outer", "none", "Simulation Hints:", "Slightly modify the simulated behaviour. Recognised hints are: lax-ioctls, enable-outer. Use with caution!", urlVgCore::simHints ); addOpt( KERN_VAR, VkOPTION::ARG_STRING, VkOPTION::WDG_COMBO, "valgrind", '\0', "kernel-variant", "<variant1,variant2,...>", "none|bproc", "none", "Kernel Variants:", "Handle non-standard kernel variants. Recognised variants are: bproc. Use with caution!", urlVgCore::kernelVariant ); addOpt( EM_WARNS, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "show-emwarns", "<yes|no>", "yes|no", "no", "Show warnings about emulation limits:", "show warnings about emulation limits?", urlVgCore::showEmWarns ); addOpt( SMC_CHECK, VkOPTION::ARG_STRING, VkOPTION::WDG_COMBO, "valgrind", '\0', "smc-check", "<none|stack|all>", "none|stack|all", "stack", "Where to check for self-modifying code", "checks for self-modifying code: none, only for code on the stack, or all", urlVgCore::smcSupport ); /*--------------------------------------------------------------- */ /* options relevant to error-reporting tools */ addOpt( XML_OUTPUT, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "xml", "<yes|no>", "yes|no", "yes", "Output in xml format:", "all output is in XML", urlVgCore::xmlOutput ); addOpt( XML_COMMENT, VkOPTION::ARG_STRING, VkOPTION::WDG_NONE, "valgrind", '\0', "xml-user-comment", "<str>", "", "", "Insert verbatim in xml output", "copy <str> verbatim to XML output", urlVgCore::xmlComment ); addOpt( DEMANGLE, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "demangle", "<yes|no>", "yes|no", "yes", "Automatically demangle C++ names", "automatically demangle C++ names?", urlVgCore::autoDemangle ); addOpt( NUM_CALLERS, VkOPTION::ARG_UINT, VkOPTION::WDG_SPINBOX, "valgrind", '\0', "num-callers", "<1..50>", "1|50", "12", "Number of stack trace callers:", "show <num> callers in stack traces", urlVgCore::numCallers ); addOpt( ERROR_LIMIT, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "error-limit", "<yes|no>", "yes|no", "yes", "Limit the number of errors shown", "Stop showing new errors if too many?", urlVgCore::errorLimit ); addOpt( SHOW_BELOW, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "show-below-main", "<yes|no>", "yes|no", "no", "Continue stack traces below main()", "continue stack traces below main()", urlVgCore::stackTraces ); /*--------------------------------------------------------------- */ /* Can't access vkConfig->suppDir(): config created after us! */ QString defSuppDir = QDir::homeDirPath() + "/" + VK_CFG_DIR + VK_SUPPS_DIR; /* list of dirs holding suppression files */ addOpt( SUPPS_DIRS, VkOPTION::NOT_POPT, VkOPTION::WDG_LISTBOX, "valgrind", '\0', "supps-dirs", "", "", defSuppDir, "Suppression Dirs:", "", urlValkyrie::suppsTab ); /* list of all suppression files found in option SUPP_DIRS */ addOpt( SUPPS_AVAIL, VkOPTION::NOT_POPT, VkOPTION::WDG_LISTBOX, "valgrind", '\0', "supps-avail", "", "", "", "Available error-suppression file(s):", "", urlValkyrie::suppsTab ); /* list of selected suppression files */ addOpt( SUPPS_SEL, VkOPTION::ARG_STRING, VkOPTION::WDG_LISTBOX, "valgrind", '\0', "suppressions", "<file1,...>", "", "", "Selected error-suppression file(s):", "suppress errors described in suppressions file(s)", urlValkyrie::suppsTab ); /*--------------------------------------------------------------- */ addOpt( GEN_SUPP, VkOPTION::ARG_STRING, VkOPTION::WDG_COMBO, "valgrind", '\0', "gen-suppressions", "<yes|no|all>", "yes|no|all", "no", "Print suppressions for errors", "print suppressions for errors?", urlVgCore::genSuppressions ); addOpt( DB_ATTACH, VkOPTION::ARG_BOOL, VkOPTION::WDG_CHECK, "valgrind", '\0', "db-attach", "<yes|no>", "yes|no", "no", "Start debugger on error detection", "start debugger when errors detected?", urlVgCore::startDebugger ); addOpt( DB_COMMAND, VkOPTION::ARG_STRING, VkOPTION::WDG_LEDIT, "valgrind", '\0', "db-command", "<command>", "", "/usr/bin/gdb -nw %f %p", "Debugger:", "command to start debugger", urlVgCore::whichDebugger ); addOpt( INPUT_FD, VkOPTION::ARG_UINT, VkOPTION::WDG_SPINBOX, "valgrind", '\0', "input-fd", "<0..1024>", "0|1023", "0", "Input file descriptor:", "File descriptor for (db) input (0=stdin, 1=stdout, 2=stderr)", urlVgCore::inputFd ); addOpt( MAX_SFRAME, VkOPTION::ARG_UINT, VkOPTION::WDG_SPINBOX, "valgrind", '\0', "max-stackframe", "<number>", "0|2000000", "2000000", "Stack switch on SP changes at:", "assume stack switch for stack pointer changes larger than <number> bytes", urlVgCore::maxSFrames );}/* check argval for this option, updating if necessary. called by parseCmdArgs() and gui option pages -------------------- */int Valgrind::checkOptArg( int optid, QString& argval ){ vk_assert( optid >= 0 && optid < NUM_OPTS ); int errval = PARSED_OK; Option* opt = findOption( optid ); QString sep = vkConfig->sepChar(); switch ( (Valgrind::vgOpts)optid ) { case TOOL: /* Note: gui option disabled, so only reaches here from cmdline */ errval = PERROR_BADOPT; vkPrintErr("Option disabled '--%s'", opt->m_longFlag.latin1()); vkPrintErr(" - Valkyrie currently only supports Memcheck."); break; case SIM_HINTS: case RUN_LIBC: case NUM_CALLERS: case DEMANGLE:// case INPUT_FD: // TODO case SHOW_BELOW: case MAX_SFRAME: case SMC_CHECK: opt->isValidArg( &errval, argval ); break; case VERBOSITY: case TRACK_FDS: case TIME_STAMP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -