KDevelop API Documentation

breakpoint.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002     begin                : Tue May 13 2003
00003     copyright            : (C) 2003 by John Birch
00004     email                : jbb@kdevelop.org
00005  ***************************************************************************/
00006 
00007 /***************************************************************************
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
00013  *                                                                         *
00014  ***************************************************************************/
00015 
00016 #include "breakpoint.h"
00017 
00018 #include <klocale.h>
00019 
00020 #include <qfileinfo.h>
00021 #include <qfontmetrics.h>
00022 #include <qpainter.h>
00023 #include <qregexp.h>
00024 #include <qstring.h>
00025 
00026 #include <stdio.h>
00027 
00028 /***************************************************************************/
00029 /***************************************************************************/
00030 /***************************************************************************/
00031 
00032 namespace GDBDebugger
00033 {
00034 
00035 static int BPKey_ = 0;
00036 
00037 /***************************************************************************/
00038 /***************************************************************************/
00039 /***************************************************************************/
00040 
00041 Breakpoint::Breakpoint(bool temporary, bool enabled)
00042     : s_pending_(true),
00043       s_actionAdd_(true),
00044       s_actionClear_(false),
00045       s_actionModify_(false),
00046       s_actionDie_(false),
00047       s_dbgProcessing_(false),
00048       s_enabled_(enabled),
00049       s_temporary_(temporary),
00050       s_changedCondition_(false),
00051       s_changedIgnoreCount_(false),
00052       s_changedEnable_(false),
00053       s_hardwareBP_(false),
00054       dbgId_(-1),
00055       hits_(0),
00056       key_(BPKey_++),
00057       active_(-1),
00058       ignoreCount_(0),
00059       condition_("")
00060 {
00061 }
00062 
00063 /***************************************************************************/
00064 
00065 Breakpoint::~Breakpoint()
00066 {
00067 }
00068 
00069 /***************************************************************************/
00070 
00071 QString Breakpoint::dbgRemoveCommand() const
00072 {
00073     if (dbgId_>0)
00074         return QString("delete %1").arg(dbgId_); // gdb command - not translatable
00075 
00076     return QString();
00077 }
00078 
00079 /***************************************************************************/
00080 
00081 // called when debugger ends
00082 void Breakpoint::reset()
00083 {
00084     dbgId_                = -1;
00085     s_pending_            = true;
00086     s_actionAdd_          = true;     // waiting for the debugger to start
00087     s_actionClear_        = false;
00088     s_changedCondition_   = !condition_.isEmpty();
00089     s_changedIgnoreCount_ = (ignoreCount_>0);
00090     s_changedEnable_      = !s_enabled_;
00091     s_actionModify_       = s_changedCondition_ || s_changedIgnoreCount_ || s_changedEnable_;
00092     s_dbgProcessing_      = false;
00093     s_hardwareBP_         = false;
00094     hits_                 = 0;
00095     active_               = -1;
00096 }
00097 
00098 /***************************************************************************/
00099 
00100 void Breakpoint::setActive(int active, int id)
00101 {
00102     active_           = active;
00103     dbgId_            = id;
00104 
00105     if (s_pending_ && !(s_actionAdd_ && s_actionModify_)) {
00106         s_pending_ = false;
00107         s_actionModify_ = false;
00108     }
00109 
00110     s_actionAdd_          = false;
00111     s_actionClear_        = false;
00112     s_actionDie_          = false;
00113     s_dbgProcessing_      = false;
00114 
00115     if (!s_actionModify_) {
00116         s_changedCondition_   = false;
00117         s_changedIgnoreCount_ = false;
00118         s_changedEnable_      = false;
00119     }
00120 }
00121 
00122 /***************************************************************************/
00123 
00124 QString Breakpoint::statusDisplay(int activeFlag) const
00125 {
00126     QString status="";
00127     if (!s_enabled_)
00128         status = i18n("Disabled");
00129     else
00130     if (s_pending_)
00131     {
00132         if (s_actionAdd_)
00133             status = i18n("Pending (add)");
00134         if (s_actionClear_)
00135             status = i18n("Pending (clear)");
00136         if (s_actionModify_)
00137             status = i18n("Pending (modify)");
00138     }
00139     else
00140     if (isActive(activeFlag))
00141         status = i18n("Active");
00142 
00143     return status;
00144 }
00145 
00146 /***************************************************************************/
00147 /***************************************************************************/
00148 /***************************************************************************/
00149 
00150 FilePosBreakpoint::FilePosBreakpoint(const QString &fileName, int lineNum,
00151                                      bool temporary, bool enabled)
00152     : Breakpoint(temporary, enabled),
00153       fileName_(fileName),
00154       lineNo_(lineNum)
00155 {
00156 }
00157 
00158 /***************************************************************************/
00159 
00160 FilePosBreakpoint::~FilePosBreakpoint()
00161 {
00162 }
00163 
00164 /***************************************************************************/
00165 
00166 QString FilePosBreakpoint::dbgSetCommand() const
00167 {
00168     QString cmdStr;
00169     if (fileName_.isEmpty())
00170         cmdStr = QString("break %1").arg(lineNo_);  // gdb command - not translatable
00171     else {
00172         QFileInfo fi(fileName_);
00173         cmdStr = QString("break %1:%2").arg(fi.fileName()).arg(lineNo_); // gdb command
00174     }
00175 
00176     if (isTemporary())
00177         cmdStr = "t"+cmdStr;  // gdb command
00178 
00179     return cmdStr;
00180 }
00181 
00182 /***************************************************************************/
00183 
00184 bool FilePosBreakpoint::match(const Breakpoint *brkpt) const
00185 {
00186     // simple case
00187     if (this == brkpt)
00188         return true;
00189 
00190     // Type case
00191     const FilePosBreakpoint* check = dynamic_cast<const FilePosBreakpoint*>(brkpt);
00192     if (!check)
00193         return false;
00194 
00195     // member case
00196     return  ( (fileName_ == check->fileName_) &&
00197               (lineNo_ == check->lineNo_));
00198 }
00199 
00200 /***************************************************************************/
00201 
00202 QString FilePosBreakpoint::location(bool compact)
00203 {
00204     if (compact)
00205         return QFileInfo(fileName_).fileName()+":"+QString::number(lineNo_);
00206 
00207     return fileName_+":"+QString::number(lineNo_);
00208 }
00209 
00210 /***************************************************************************/
00211 
00212 void FilePosBreakpoint::setLocation(const QString& location)
00213 {
00214     QRegExp regExp1("(.*):(\\d+)$");
00215     regExp1.setMinimal(true);
00216     if ( regExp1.search(location, 0) >= 0 )
00217     {
00218         QString t = regExp1.cap(1);
00219         QString dirPath = QFileInfo(t).dirPath();
00220         if ( dirPath == "." )
00221             fileName_ = QFileInfo(fileName_).dirPath()+"/"+regExp1.cap(1);
00222         else
00223             fileName_ = regExp1.cap(1);
00224 
00225         lineNo_ = regExp1.cap(2).toInt();
00226     }
00227 }
00228 
00229 /***************************************************************************/
00230 /***************************************************************************/
00231 /***************************************************************************/
00232 
00233 Watchpoint::Watchpoint(const QString& varName, bool temporary, bool enabled)
00234     : Breakpoint(temporary, enabled),
00235       varName_(varName)
00236 {
00237 }
00238 
00239 /***************************************************************************/
00240 
00241 Watchpoint::~Watchpoint()
00242 {
00243 }
00244 
00245 /***************************************************************************/
00246 
00247 QString Watchpoint::dbgSetCommand() const
00248 {
00249     return QString("watch ")+varName_;    // gdb command - not translatable
00250 }
00251 
00252 /***************************************************************************/
00253 
00254 bool Watchpoint::match(const Breakpoint* brkpt) const
00255 {
00256     // simple case
00257     if (this == brkpt)
00258         return true;
00259 
00260     // Type case
00261     const Watchpoint *check = dynamic_cast<const Watchpoint*>(brkpt);
00262     if (!check)
00263         return false;
00264 
00265     // member case
00266     return (varName_ == check->varName_);
00267 }
00268 
00269 /***************************************************************************/
00270 /***************************************************************************/
00271 /***************************************************************************/
00272 
00273 AddressBreakpoint::AddressBreakpoint(const QString& breakAddress, bool temporary, bool enabled)
00274     : Breakpoint(temporary, enabled),
00275       m_breakAddress(breakAddress)
00276 {
00277 }
00278 
00279 /***************************************************************************/
00280 
00281 AddressBreakpoint::~AddressBreakpoint()
00282 {
00283 }
00284 
00285 /***************************************************************************/
00286 
00287 QString AddressBreakpoint::dbgSetCommand() const
00288 {
00289     return QString("break ")+m_breakAddress;    // gdb command - not translatable
00290 }
00291 
00292 /***************************************************************************/
00293 
00294 bool AddressBreakpoint::match(const Breakpoint* brkpt) const
00295 {
00296     // simple case
00297     if (this == brkpt)
00298         return true;
00299 
00300     // Type case
00301     const AddressBreakpoint *check = dynamic_cast<const AddressBreakpoint*>(brkpt);
00302     if (!check)
00303         return false;
00304 
00305     // member case
00306     return (m_breakAddress == check->m_breakAddress);
00307 }
00308 
00309 /***************************************************************************/
00310 /***************************************************************************/
00311 /***************************************************************************/
00312 
00313 FunctionBreakpoint::FunctionBreakpoint(const QString& functionName, bool temporary, bool enabled)
00314     : Breakpoint(temporary, enabled),
00315       m_functionName(functionName)
00316 {
00317 }
00318 
00319 /***************************************************************************/
00320 
00321 FunctionBreakpoint::~FunctionBreakpoint()
00322 {
00323 }
00324 
00325 /***************************************************************************/
00326 
00327 QString FunctionBreakpoint::dbgSetCommand() const
00328 {
00329     return QString("break ")+m_functionName;    // gdb command - not translatable
00330 }
00331 
00332 /***************************************************************************/
00333 
00334 bool FunctionBreakpoint::match(const Breakpoint* brkpt) const
00335 {
00336     // simple case
00337     if (this == brkpt)
00338         return true;
00339 
00340     // Type case
00341     const FunctionBreakpoint *check = dynamic_cast<const FunctionBreakpoint*>(brkpt);
00342     if (!check)
00343         return false;
00344 
00345     // member case
00346     return (m_functionName == check->m_functionName);
00347 }
00348 
00349 /***************************************************************************/
00350 /***************************************************************************/
00351 /***************************************************************************/
00352 
00353 //ExitBreakpoint::ExitBreakpoint(bool temporary, bool enabled) :
00354 //  Breakpoint(temporary, enabled)
00355 //{
00356 //}
00357 //
00359 //
00360 //ExitBreakpoint::~ExitBreakpoint()
00361 //{
00362 //}
00363 //
00365 //
00366 //QString ExitBreakpoint::dbgSetCommand() const
00367 //{
00368 //  return "";
00369 //}
00370 //
00372 //
00373 //bool ExitBreakpoint::match(const Breakpoint* brkpt) const
00374 //{
00375 //  // simple case
00376 //  if (this == brkpt)
00377 //    return true;
00378 //
00379 //  // Type case
00380 //  const ExitBreakpoint* check = dynamic_cast<const ExitBreakpoint*>(brkpt);
00381 //  if (!check)
00382 //    return false;
00383 //
00384 //  // member case
00385 //  return true;
00386 //}
00387 //
00388 /***************************************************************************/
00389 /***************************************************************************/
00390 /***************************************************************************/
00391 //
00392 // These are implemented in gdb but can cause a lot of breakpoints
00393 // to be set. This needs more thought before being implemented
00394 
00395 //RegExpBreakpoint::RegExpBreakpoint(bool temporary, bool enabled) :
00396 //  Breakpoint(temporary, enabled)
00397 //{
00398 //}
00399 //
00401 //
00402 //RegExpBreakpoint::~RegExpBreakpoint()
00403 //{
00404 //}
00405 //
00407 //
00408 //QString RegExpBreakpoint::dbgSetCommand() const
00409 //{
00410 //  return "";
00411 //}
00412 //
00414 //
00419 //
00420 /***************************************************************************/
00421 /***************************************************************************/
00422 /***************************************************************************/
00423 
00424 // Most catch options arn't implemented in gdb so ignore this for now.
00425 
00426 //CatchBreakpoint::CatchBreakpoint(bool temporary, bool enabled) :
00427 //  Breakpoint(temporary, enabled)
00428 //{
00429 //}
00430 //
00432 //
00433 //CatchBreakpoint::~CatchBreakpoint()
00434 //{
00435 //}
00436 //
00438 //
00439 //QString CatchBreakpoint::dbgSetCommand() const
00440 //{
00441 //  return "";
00442 //}
00443 //
00445 //
00450 //
00451 /***************************************************************************/
00452 /***************************************************************************/
00453 /***************************************************************************/
00454 
00455 }
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:46 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003