📄 ddump_viewer.cpp
字号:
/* * =========================================================================== * PRODUCTION $Log: ddump_viewer.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 19:39:59 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * PRODUCTION * =========================================================================== *//* $Id: ddump_viewer.cpp,v 1000.1 2004/06/01 19:39:59 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Andrei Gourianov * * File Description: * Console Debug Dump Viewer * */#include <ncbi_pch.hpp>#include <typeinfo>#include <corelib/ncbiapp.hpp>#include <corelib/ncbifile.hpp>#include <corelib/ncbireg.hpp>#include <util/ddump_viewer.hpp>#ifdef NCBI_OS_MSWIN# include <windows.h>#else# include <signal.h>#endifBEGIN_NCBI_SCOPE//---------------------------------------------------------------------------// CDebugDumpViewer implementationbool CDebugDumpViewer::x_GetInput(string& input){ char cBuf[512]; cout << "command>"; cin.getline(cBuf, sizeof(cBuf)/sizeof(cBuf[0])); input = cBuf; return (input != "go");}const void* CDebugDumpViewer::x_StrToPtr(const string& str){ void* addr = 0; addr = reinterpret_cast<void*>(NStr::StringToULong(str,16)); return addr;}bool CDebugDumpViewer::x_CheckAddr( const void* addr, bool report){ bool res = false; try { const CDebugDumpable *p = static_cast<const CDebugDumpable*>(addr); const type_info& t = typeid( *p); if (report) { cout << "typeid of " << addr << " is \"" << t.name() << "\"" << endl; } res = true; } catch (exception& e) { if (report) { cout << e.what() << endl; cout << "address " << addr << " does not point to a dumpable object " << endl; } } return res;}bool CDebugDumpViewer::x_CheckLocation(const char* file, int line){ CNcbiRegistry& cfg = CNcbiApplication::Instance()->GetConfig(); string section("DebugDumpBpt"); string value = cfg.Get( section, "enabled"); // the section is absent? - enable all if (value.empty()) { return true; } // prerequisite bool enabled = ((value != "false") && (value != "0")); // Now only listed locations will be treated accordingly // smth about this particular file? string name = CDirEntry(file).GetName(); value = cfg.Get( section, name); if (value.empty() || (value=="none")) { return !enabled; // none are "enabled" } else if (value == "all") { return enabled; // all are "enabled" } // otherwise - look for this particular line // location range must be in the form "10,20-30,150-200" list<string> loc; NStr::Split( value,",",loc); list<string>::iterator it_loc; for (it_loc = loc.begin(); it_loc != loc.end(); ++it_loc) { list<string> range; list<string>::iterator it_range; NStr::Split( *it_loc,"-",range); int from=0, to; try { it_range = range.begin(); from = NStr::StringToInt( *it_range); to = NStr::StringToInt( *(++it_range)); } catch (...) { to = from; } if ((line >= from) && (line <= to)) { return enabled; } } return !enabled;}void CDebugDumpViewer::x_Info( const string& name, const CDebugDumpable* curr_object, const string& location){ cout << endl; cout << "Console Debug Dump Viewer" << endl << endl; cout << "Stopped at " << location << endl; cout << "current object: " << name << " = " << static_cast<const void*>(curr_object) << endl << endl; cout << "Available commands: " << endl; cout << " t[ypeid] <address>" << endl; cout << " d[ump] <address> <depth>" << endl;#ifdef NCBI_OS_MSWIN cout << " b[reak]" << endl;#endif cout << " go" << endl << endl;}void CDebugDumpViewer::Bpt( const string& name, const CDebugDumpable* curr_object, const char* file, int line){ if (!x_CheckLocation(file, line)) { return; } string location, input, cmnd0, cmnd1, cmnd2; list<string> cmnd; list<string>::iterator it_cmnd; int narg; unsigned int depth; bool need_info; location = string(file) + "(" + NStr::IntToString(line) + ")"; x_Info( name, curr_object, location); curr_object->DebugDumpText(cout, location + ": " + name, 0); while (x_GetInput(input)) { cmnd.clear(); NStr::Split( input, " ", cmnd); narg = cmnd.size(); need_info = true; if (narg > 0) { cmnd0 = *(it_cmnd = cmnd.begin()); cmnd1 = (narg > 1) ? *(++it_cmnd) : string(""); cmnd2 = (narg > 2) ? *(++it_cmnd) : string(""); switch (cmnd0[0]) { case 'b': // break#ifdef NCBI_OS_MSWIN DebugBreak();//#else// raise(SIGSTOP);#endif break; case 't': // typeid if (narg > 1) { const void* addr = x_StrToPtr( cmnd1); x_CheckAddr( addr, true); need_info = false; } break; case 'd': // dump if (narg>1) { const void* addr = x_StrToPtr( cmnd1); if (x_CheckAddr( addr, false)) { depth = (narg>2) ? NStr::StringToUInt( cmnd2) : 0; const CDebugDumpable *p = static_cast<const CDebugDumpable*>(addr); try { const type_info& t = typeid( *p); p->DebugDumpText(cout, string(t.name()) + " " + cmnd1, depth); } catch (...) { cout << "Exception: Dump failed" << endl; } } need_info = false; } break; default: break; } } // default = help if (need_info) { x_Info( name, curr_object, location); } }}END_NCBI_SCOPE/* * =========================================================================== * $Log: ddump_viewer.cpp,v $ * Revision 1000.1 2004/06/01 19:39:59 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * * Revision 1.4 2004/05/17 21:06:02 gorelenk * Added include of PCH ncbi_pch.hpp * * Revision 1.3 2002/06/04 16:34:58 gouriano * added possibility to enable/disable debug dump breakpoints from registry * * Revision 1.2 2002/06/03 20:37:52 gouriano * added include <typeinfo> * * Revision 1.1 2002/06/03 20:25:32 gouriano * added debug dump viewer class * * * =========================================================================== */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -