ddump_viewer.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ddump_viewer.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:39:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ddump_viewer.cpp,v 1000.1 2004/06/01 19:39:59 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Andrei Gourianov
  35.  *
  36.  * File Description:
  37.  *      Console Debug Dump Viewer
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <typeinfo>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbifile.hpp>
  44. #include <corelib/ncbireg.hpp>
  45. #include <util/ddump_viewer.hpp>
  46. #ifdef NCBI_OS_MSWIN
  47. #  include <windows.h>
  48. #else
  49. #  include <signal.h>
  50. #endif
  51. BEGIN_NCBI_SCOPE
  52. //---------------------------------------------------------------------------
  53. //  CDebugDumpViewer implementation
  54. bool CDebugDumpViewer::x_GetInput(string& input)
  55. {
  56.     char cBuf[512];
  57.     cout << "command>";
  58.     cin.getline(cBuf, sizeof(cBuf)/sizeof(cBuf[0]));
  59.     input = cBuf;
  60.     return (input != "go");
  61. }
  62. const void* CDebugDumpViewer::x_StrToPtr(const string& str)
  63. {
  64.     void* addr = 0;
  65.     addr = reinterpret_cast<void*>(NStr::StringToULong(str,16));
  66.     return addr;
  67. }
  68. bool CDebugDumpViewer::x_CheckAddr( const void* addr, bool report)
  69. {
  70.     bool res = false;
  71.     try {
  72.         const CDebugDumpable *p = static_cast<const CDebugDumpable*>(addr);
  73.         const type_info& t = typeid( *p);
  74.         if (report) {
  75.             cout << "typeid of " << addr
  76.                 << " is "" << t.name() << """ << endl;
  77.         }
  78.         res = true;
  79.     } catch (exception& e) {
  80.         if (report) {
  81.             cout << e.what() << endl;
  82.             cout << "address " << addr
  83.                 << " does not point to a dumpable object " << endl;
  84.         }
  85.     }
  86.     return res;
  87. }
  88. bool CDebugDumpViewer::x_CheckLocation(const char* file, int line)
  89. {
  90.     CNcbiRegistry& cfg = CNcbiApplication::Instance()->GetConfig();
  91.     string section("DebugDumpBpt");
  92.     string value = cfg.Get( section, "enabled");
  93.     // the section is absent? - enable all
  94.     if (value.empty()) {
  95.         return true;
  96.     }
  97.     // prerequisite
  98.     bool enabled = ((value != "false") && (value != "0"));
  99.     // Now only listed locations will be treated accordingly
  100.     // smth about this particular file?
  101.     string name = CDirEntry(file).GetName();
  102.     value = cfg.Get( section, name);
  103.     if (value.empty() || (value=="none")) {
  104.         return !enabled; // none are "enabled"
  105.     } else if (value == "all") {
  106.         return enabled;  // all are "enabled"
  107.     }
  108.     // otherwise - look for this particular line
  109.     // location range must be in the form "10,20-30,150-200"
  110.     list<string> loc;
  111.     NStr::Split( value,",",loc);
  112.     list<string>::iterator it_loc;
  113.     for (it_loc = loc.begin(); it_loc != loc.end(); ++it_loc) {
  114.         list<string> range;
  115.         list<string>::iterator it_range;
  116.         NStr::Split( *it_loc,"-",range);
  117.         int from=0, to;
  118.         try {
  119.             it_range = range.begin();
  120.             from = NStr::StringToInt( *it_range);
  121.             to   = NStr::StringToInt( *(++it_range));
  122.         } catch (...) {
  123.             to = from;
  124.         }
  125.         if ((line >= from) && (line <= to)) {
  126.             return enabled;
  127.         }
  128.     }
  129.     return !enabled;
  130. }
  131. void CDebugDumpViewer::x_Info(
  132.     const string& name, const CDebugDumpable* curr_object,
  133.     const string& location)
  134. {
  135.     cout << endl;
  136.     cout << "Console Debug Dump Viewer" << endl << endl;
  137.     cout << "Stopped at " << location << endl;
  138.     cout << "current object: " << name << " = " <<
  139.         static_cast<const void*>(curr_object) << endl << endl;
  140.     cout << "Available commands: "  << endl;
  141.     cout << "    t[ypeid] <address>"  << endl;
  142.     cout << "    d[ump]   <address> <depth>"  << endl;
  143. #ifdef NCBI_OS_MSWIN
  144.     cout << "    b[reak]"  << endl;
  145. #endif
  146.     cout << "    go"  << endl << endl;
  147. }
  148. void CDebugDumpViewer::Bpt(
  149.     const string& name, const CDebugDumpable* curr_object,
  150.     const char* file, int line)
  151. {
  152.     if (!x_CheckLocation(file, line)) {
  153.         return;
  154.     }
  155.     string location, input, cmnd0, cmnd1, cmnd2;
  156.     list<string> cmnd;
  157.     list<string>::iterator it_cmnd;
  158.     int narg;
  159.     unsigned int depth;
  160.     bool need_info;
  161.     location = string(file) + "(" + NStr::IntToString(line) + ")";
  162.     x_Info( name, curr_object, location);
  163.     curr_object->DebugDumpText(cout, location + ": " + name, 0);
  164.     while (x_GetInput(input)) {
  165.         cmnd.clear();
  166.         NStr::Split( input, " ", cmnd);
  167.         narg = cmnd.size();
  168.         need_info = true;
  169.         if (narg > 0) {
  170.             cmnd0 = *(it_cmnd = cmnd.begin());
  171.             cmnd1 = (narg > 1) ? *(++it_cmnd) : string("");
  172.             cmnd2 = (narg > 2) ? *(++it_cmnd) : string("");
  173.             switch (cmnd0[0]) {
  174.             case 'b': // break
  175. #ifdef NCBI_OS_MSWIN
  176.                 DebugBreak();
  177. //#else
  178. //                raise(SIGSTOP);
  179. #endif
  180.                 break;
  181.             case 't': // typeid
  182.                 if (narg > 1) {
  183.                     const void* addr = x_StrToPtr( cmnd1);
  184.                     x_CheckAddr( addr, true);
  185.                     need_info = false;
  186.                 }
  187.                 break;
  188.             case 'd': // dump
  189.                 if (narg>1) {
  190.                     const void* addr = x_StrToPtr( cmnd1);
  191.                     if (x_CheckAddr( addr, false))
  192.                     {
  193.                         depth = (narg>2) ? NStr::StringToUInt( cmnd2) : 0;
  194.                         const CDebugDumpable *p =
  195.                             static_cast<const CDebugDumpable*>(addr);
  196.                         try {
  197.                             const type_info& t = typeid( *p);
  198.                             p->DebugDumpText(cout,
  199.                                 string(t.name()) + " " + cmnd1, depth);
  200.                         } catch (...) {
  201.                             cout << "Exception: Dump failed" << endl;
  202.                         }
  203.                     }
  204.                     need_info = false;
  205.                 }
  206.                 break;
  207.             default:
  208.                 break;
  209.             }
  210.         }
  211.         // default = help
  212.         if (need_info) {
  213.             x_Info( name, curr_object, location);
  214.         }
  215.     }
  216. }
  217. END_NCBI_SCOPE
  218. /*
  219.  * ===========================================================================
  220.  * $Log: ddump_viewer.cpp,v $
  221.  * Revision 1000.1  2004/06/01 19:39:59  gouriano
  222.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  223.  *
  224.  * Revision 1.4  2004/05/17 21:06:02  gorelenk
  225.  * Added include of PCH ncbi_pch.hpp
  226.  *
  227.  * Revision 1.3  2002/06/04 16:34:58  gouriano
  228.  * added possibility to enable/disable debug dump breakpoints from registry
  229.  *
  230.  * Revision 1.2  2002/06/03 20:37:52  gouriano
  231.  * added include <typeinfo>
  232.  *
  233.  * Revision 1.1  2002/06/03 20:25:32  gouriano
  234.  * added debug dump viewer class
  235.  *
  236.  *
  237.  * ===========================================================================
  238.  */