From 696d0835c2030e38042596c875ae4b49c0ffbb13 Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 6 Sep 2012 17:17:38 +0000 Subject: [PATCH] Debugger: added Attach/Detach git-svn-id: trunk@38544 - --- debugger/gdbmidebugger.pp | 18 ++++++++++ ide/debugmanager.pas | 75 ++++++++++++++++++++++++++------------- ide/main.pp | 5 ++- 3 files changed, 73 insertions(+), 25 deletions(-) diff --git a/debugger/gdbmidebugger.pp b/debugger/gdbmidebugger.pp index 3eff6b8b9a..209ef43411 100644 --- a/debugger/gdbmidebugger.pp +++ b/debugger/gdbmidebugger.pp @@ -4668,6 +4668,16 @@ begin Result := True; FSuccess := False; + if not ExecuteCommand('-file-exec-and-symbols %s', + [FTheDebugger.ConvertToGDBPath(UTF8ToSys(''), cgptExeName)], R) + then + R.State := dsError; + if R.State = dsError then begin + SetDebuggerErrorState('Attach failed'); + exit; + end; + + // Tnit (StartDebugging) TargetInfo^.TargetFlags := [tfHasSymbols]; // Set until proven otherwise ExecuteCommand('-gdb-set language pascal', [cfCheckError]); @@ -4748,6 +4758,14 @@ begin TargetInfo^.TargetPID := NewPID; +debugln(['XXXXXXXXXXXXXX ',FTheDebugger.FileName, ' -- ', pos('Reading symbols from', CmdResp)]); + if (FTheDebugger.FileName <> '') and (pos('READING SYMBOLS FROM', UpperCase(CmdResp)) < 1) then begin + ExecuteCommand('ptype TObject', [], R); + if pos('NO SYMBOL TABLE IS LOADED', UpperCase(FFullCmdReply)) > 0 then begin + ExecuteCommand('-file-exec-and-symbols %s', + [FTheDebugger.ConvertToGDBPath(UTF8ToSys(FTheDebugger.FileName), cgptExeName)], R); + end; + end; // Tnit (StartDebugging) // check if the exe is compiled with FPC >= 1.9.2 diff --git a/ide/debugmanager.pas b/ide/debugmanager.pas index bda240463a..790df95a6d 100644 --- a/ide/debugmanager.pas +++ b/ide/debugmanager.pas @@ -152,7 +152,7 @@ type procedure ResetDebugger; function GetLaunchPathAndExe(out LaunchingCmdLine, LaunchingApplication, - LaunchingParams: String): Boolean; + LaunchingParams: String; PromptOnError: Boolean = True): Boolean; protected function GetState: TDBGState; override; function GetCommands: TDBGCommands; override; @@ -2018,7 +2018,16 @@ begin end; function TDebugManager.GetLaunchPathAndExe(out LaunchingCmdLine, - LaunchingApplication, LaunchingParams: String): Boolean; + LaunchingApplication, LaunchingParams: String; PromptOnError: Boolean + ): Boolean; + + procedure ClearPathAndExe; + begin + LaunchingApplication := ''; + LaunchingParams := ''; + LaunchingCmdLine := ''; + end; + var NewDebuggerClass: TDebuggerClass; begin @@ -2038,43 +2047,53 @@ begin if not DirectoryExistsUTF8(LaunchingApplication) then begin - if MessageDlg(lisLaunchingApplicationInvalid, - Format(lisTheLaunchingApplicationBundleDoesNotExists, - [LaunchingCmdLine, #13, #13, #13, #13]), - mtError, [mbYes, mbNo, mbCancel], 0) = mrYes then - begin - if not BuildBoss.CreateProjectApplicationBundle then Exit; - end + if not PromptOnError then + ClearPathAndExe else - Exit; + if MessageDlg(lisLaunchingApplicationInvalid, + Format(lisTheLaunchingApplicationBundleDoesNotExists, + [LaunchingCmdLine, #13, #13, #13, #13]), + mtError, [mbYes, mbNo, mbCancel], 0) = mrYes then + begin + if not BuildBoss.CreateProjectApplicationBundle then Exit; + end + else + Exit; end; - if NewDebuggerClass = TProcessDebugger then + if (NewDebuggerClass = TProcessDebugger) and (LaunchingApplication <> '') then begin // use executable path inside Application Bundle (darwin only) LaunchingApplication := LaunchingApplication + '/Contents/MacOS/' + ExtractFileNameOnly(LaunchingApplication); - LaunchingParams := LaunchingParams; end; end else if not FileIsExecutable(LaunchingApplication) then begin - MessageDlg(lisLaunchingApplicationInvalid, - Format(lisTheLaunchingApplicationDoesNotExistsOrIsNotExecuta, ['"', - LaunchingCmdLine, '"', #13, #13, #13]), - mtError, [mbOK],0); - Exit; + if not PromptOnError then + ClearPathAndExe + else begin + MessageDlg(lisLaunchingApplicationInvalid, + Format(lisTheLaunchingApplicationDoesNotExistsOrIsNotExecuta, ['"', + LaunchingCmdLine, '"', #13, #13, #13]), + mtError, [mbOK],0); + Exit; + end; end; //todo: this check depends on the debugger class if (NewDebuggerClass <> TProcessDebugger) and not FileIsExecutable(EnvironmentOptions.GetParsedDebuggerFilename) then begin - MessageDlg(lisDebuggerInvalid, - Format(lisTheDebuggerDoesNotExistsOrIsNotExecutableSeeEnviro, ['"', - EnvironmentOptions.DebuggerFilename, '"', #13, #13, #13]), - mtError,[mbOK],0); - Exit; + if not PromptOnError then + ClearPathAndExe + else begin + MessageDlg(lisDebuggerInvalid, + Format(lisTheDebuggerDoesNotExistsOrIsNotExecutableSeeEnviro, ['"', + EnvironmentOptions.DebuggerFilename, '"', #13, #13, #13]), + mtError,[mbOK],0); + Exit; + end; end; end; // if NewDebuggerClass.RequiresLocalExecutable then @@ -2097,11 +2116,14 @@ begin exit; end; + if Destroying then Exit; if not(difInitForAttach in AFlags) then begin - if (Project1.MainUnitID < 0) or Destroying then Exit; + if (Project1.MainUnitID < 0) then Exit; if not GetLaunchPathAndExe(LaunchingCmdLine, LaunchingApplication, LaunchingParams) then exit; - end; + end + else + GetLaunchPathAndExe(LaunchingCmdLine, LaunchingApplication, LaunchingParams, False); FUnitInfoProvider.Clear; FIsInitializingDebugger:= True; @@ -2206,6 +2228,11 @@ begin then FDebugger.Arguments := LaunchingParams; if FDebugger <> nil then FDebugger.ShowConsole := not Project1.CompilerOptions.Win32GraphicApp; + end + else begin + // attach + if (FDebugger <> nil) and (LaunchingApplication <> '') + then FDebugger.FileName := LaunchingApplication; end; // check if debugging needs restart diff --git a/ide/main.pp b/ide/main.pp index f3e17d34ea..20d1140195 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -3391,7 +3391,10 @@ begin if InputQuery(rsAttachTo, rsEnterPID, s) then begin ToolStatus := itDebugger; DebugBoss.Attach(s); - end; + end + else + if ToolStatus = itDebugger then + ToolStatus := itNone; end; end; ecDetach: