/debugger/test/debugtestform.pp

http://github.com/graemeg/lazarus · Puppet · 323 lines · 283 code · 40 blank · 0 comment · 11 complexity · 14bd70e7901d4466f5b558e4a8dda6e8 MD5 · raw file

  1. { $Id$ }
  2. { ----------------------------------------
  3. debugtestform.pp - Debugger test app
  4. ----------------------------------------
  5. @created(Wed Feb 25st WET 2001)
  6. @lastmod($Date$)
  7. @author(Marc Weustink <marc@@dommelstein.net>)
  8. ***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. *
  14. * *
  15. ***************************************************************************/
  16. }
  17. unit debugtestform;
  18. {$mode objfpc}
  19. {$H+}
  20. interface
  21. uses
  22. Classes, Graphics, Controls, Forms, Dialogs, LResources,
  23. Buttons, StdCtrls, Debugger, DbgOutputForm, BreakpointsDlg,
  24. LocalsDlg, WatchesDlg, CallStackDlg;
  25. type
  26. TDebugTestForm = class(TForm)
  27. cmdInit : TButton;
  28. cmdDone : TButton;
  29. cmdRun : TButton;
  30. cmdPause : TButton;
  31. cmdStop : TButton;
  32. cmdStep : TButton;
  33. cmdStepInto : TButton;
  34. cmdSetBreak : TButton;
  35. cmdResetBreak : TButton;
  36. lblFileName: TLabel;
  37. lblAdress: TLabel;
  38. lblSource: TLabel;
  39. lblLine: TLabel;
  40. lblFunc: TLabel;
  41. lblState: TLabel;
  42. lblBreak: TLabel;
  43. lblEvaluate: TLabel;
  44. lblTest: TLabel;
  45. txtLog: TMemo;
  46. cmdCommand: TButton;
  47. cmdClear: TButton;
  48. txtCommand: TEdit;
  49. txtFileName: TEdit;
  50. txtBreakFile: TEdit;
  51. txtBreakLine: TEdit;
  52. chkBreakEnable: TCheckBox;
  53. txtEvaluate: TEdit;
  54. lblEvalResult: TLabel;
  55. cmdEvaluate: TButton;
  56. procedure FormCreate(Sender: TObject);
  57. procedure FormDestroy(Sender: TObject);
  58. procedure cmdInitClick(Sender: TObject);
  59. procedure cmdDoneClick(Sender: TObject);
  60. procedure cmdRunClick(Sender: TObject);
  61. procedure cmdPauseClick(Sender: TObject);
  62. procedure cmdStopClick(Sender: TObject);
  63. procedure cmdStepClick(Sender: TObject);
  64. procedure cmdStepIntoClick(Sender: TObject);
  65. procedure cmdCommandClick(Sender: TObject);
  66. procedure cmdClearClick(Sender: TObject);
  67. procedure cmdSetBreakClick(Sender: TObject);
  68. procedure cmdResetBreakClick(Sender: TObject);
  69. procedure cmdEvaluateClick(Sender: TObject);
  70. procedure chkBreakEnableClick(Sender: TObject);
  71. private
  72. FDebugger: TDebugger;
  73. FOutputForm: TDBGOutputForm;
  74. FBreakpointDlg: TBreakpointsDlg;
  75. FLocalsDlg: TLocalsDlg;
  76. FWatchesDlg: TWatchesDlg;
  77. FCallStackDlg: TCallStackDlg;
  78. FDummy: Boolean;
  79. procedure DBGState(Sender: TObject);
  80. procedure DBGCurrent(Sender: TObject; const ALocation: TDBGLocationRec);
  81. procedure DBGOutput(Sender: TObject; const AText: String);
  82. procedure DBGTargetOutput(Sender: TObject; const AText: String);
  83. procedure OutputFormDestroy(Sender: TObject);
  84. protected
  85. procedure Loaded; override;
  86. public
  87. destructor Destroy; override;
  88. published
  89. property Dummy: Boolean read FDummy write FDummy; // insert some dummies until fpcbug #1888 is fixed
  90. property Dummy1: Boolean read FDummy write FDummy; // insert some dummies until fpcbug #1888 is fixed
  91. property Dummy2: Boolean read FDummy write FDummy; // insert some dummies until fpcbug #1888 is fixed
  92. property Dummy3: Boolean read FDummy write FDummy; // insert some dummies until fpcbug #1888 is fixed
  93. end;
  94. var
  95. DebugTestFrm: TDebugTestForm;
  96. implementation
  97. uses
  98. SysUtils,
  99. GDBMIDebugger;
  100. procedure TDebugTestForm.Loaded;
  101. begin
  102. inherited Loaded;
  103. // Not yet through resources
  104. //txtLog.Scrollbars := ssBoth;
  105. end;
  106. destructor TDebugTestForm.Destroy;
  107. begin
  108. // This shouldn't be needed, but the OnDestroy event isn't called
  109. inherited;
  110. // FormDestroy(Self);
  111. end;
  112. procedure TDebugTestForm.FormCreate(Sender: TObject);
  113. begin
  114. txtLog.Lines.Clear;
  115. FDebugger := nil;
  116. FBreakpointDlg := TBreakpointsDlg.Create(Application);
  117. FBreakpointDlg.Show;
  118. FLocalsDlg := TLocalsDlg.Create(Application);
  119. FLocalsDlg.Show;
  120. FWatchesDlg := TWatchesDlg.Create(Application);
  121. FWatchesDlg.Show;
  122. FOutputForm := TDBGOutputForm.Create(Application);
  123. FOutputForm.Show;
  124. FCallStackDlg := TCallStackDlg.Create(Application);
  125. FCallStackDlg.Show;
  126. end;
  127. procedure TDebugTestForm.FormDestroy(Sender: TObject);
  128. begin
  129. try
  130. FBreakpointDlg.Debugger := nil;
  131. FLocalsDlg.Debugger := nil;
  132. FWatchesDlg.Debugger := nil;
  133. FOutputForm.Debugger := nil;
  134. FCallStackDlg.Debugger := nil;
  135. except
  136. on Exception do;
  137. end;
  138. FDebugger.Free;
  139. FDebugger := nil;
  140. end;
  141. procedure TDebugTestForm.cmdInitClick(Sender: TObject);
  142. begin
  143. if FDebugger = nil
  144. then begin
  145. FDebugger := TGDBMIDebugger.Create('/usr/bin/gdb');
  146. FDebugger.OnDbgOutput := @DBGOutput;
  147. FDebugger.OnOutput := @DBGTargetOutput;
  148. FDebugger.OnCurrent := @DBGCurrent;
  149. FDebugger.OnState := @DBGState;
  150. TDBGBreakPointGroup(FDebugger.BreakPointGroups.Add).Name := 'Default';
  151. FBreakpointDlg.Debugger := FDebugger;
  152. FLocalsDlg.Debugger := FDebugger;
  153. FWatchesDlg.Debugger := FDebugger;
  154. FOutputForm.Debugger := FDebugger;
  155. FCallStackDlg.Debugger := FDebugger;
  156. end;
  157. FDebugger.Init;
  158. FDebugger.FileName := txtFileName.Text;
  159. end;
  160. procedure TDebugTestForm.cmdDoneClick(Sender: TObject);
  161. begin
  162. if FDebugger <> nil
  163. then begin
  164. FDebugger.Done;
  165. FBreakpointDlg.Debugger := nil;
  166. FLocalsDlg.Debugger := nil;
  167. FWatchesDlg.Debugger := nil;
  168. FOutputForm.Debugger := nil;
  169. FWatchesDlg.Debugger := nil;
  170. FDebugger.Free;
  171. FDebugger := nil;
  172. end;
  173. end;
  174. procedure TDebugTestForm.cmdRunClick(Sender: TObject);
  175. begin
  176. if FDebugger <> nil
  177. then begin
  178. FDebugger.FileName := txtFileName.Text;
  179. FDebugger.Run;
  180. end;
  181. end;
  182. procedure TDebugTestForm.cmdPauseClick(Sender: TObject);
  183. begin
  184. if FDebugger <> nil
  185. then begin
  186. FDebugger.Pause;
  187. end;
  188. end;
  189. procedure TDebugTestForm.cmdStepClick(Sender: TObject);
  190. begin
  191. if FDebugger <> nil
  192. then begin
  193. FDebugger.StepOver;
  194. end;
  195. end;
  196. procedure TDebugTestForm.cmdStepIntoClick(Sender: TObject);
  197. begin
  198. if FDebugger <> nil
  199. then begin
  200. FDebugger.StepInto;
  201. end;
  202. end;
  203. procedure TDebugTestForm.cmdStopClick(Sender: TObject);
  204. begin
  205. if FDebugger <> nil
  206. then begin
  207. FDebugger.Stop;
  208. end;
  209. end;
  210. procedure TDebugTestForm.cmdCommandClick(Sender: TObject);
  211. begin
  212. TGDBMIDebugger(FDebugger).TestCmd(txtCommand.Text);
  213. end;
  214. procedure TDebugTestForm.cmdClearClick(Sender: TObject);
  215. begin
  216. txtLog.Lines.Clear;
  217. end;
  218. procedure TDebugTestForm.cmdSetBreakClick(Sender: TObject);
  219. begin
  220. FDebugger.Breakpoints.Add(txtBreakFile.Text, StrToIntDef(txtBreakLine.Text, 1));
  221. end;
  222. procedure TDebugTestForm.cmdResetBreakClick(Sender: TObject);
  223. begin
  224. if FDebugger.Breakpoints.Count > 0
  225. then FDebugger.Breakpoints[0].Free;
  226. end;
  227. procedure TDebugTestForm.chkBreakEnableClick(Sender: TObject);
  228. begin
  229. if FDebugger.Breakpoints.Count > 0
  230. then FDebugger.Breakpoints[0].Enabled := chkBreakEnable.Checked;
  231. end;
  232. procedure TDebugTestForm.cmdEvaluateClick(Sender: TObject);
  233. var
  234. S: String;
  235. begin
  236. FDebugger.Evaluate(txtEvaluate.Text, S);
  237. lblEvalResult.Caption := S;
  238. end;
  239. procedure TDebugTestForm.OutputFormDestroy(Sender: TObject);
  240. begin
  241. FOutputForm := nil;
  242. end;
  243. procedure TDebugTestForm.DBGOutput(Sender: TObject; const AText: String);
  244. begin
  245. txtLog.Lines.Add(AText);
  246. end;
  247. procedure TDebugTestForm.DBGTargetOutput(Sender: TObject; const AText: String);
  248. begin
  249. if FOutputForm <> nil
  250. then FOutputForm.AddText(AText);
  251. end;
  252. procedure TDebugTestForm.DBGCurrent(Sender: TObject; const ALocation: TDBGLocationRec);
  253. begin
  254. lblAdress.Caption := Format('$%p', [ALocation.Adress]);
  255. lblSource.Caption := ALocation.SrcFile;
  256. lblLine.Caption := IntToStr(ALocation.SrcLine);
  257. lblFunc.Caption := ALocation.FuncName;
  258. end;
  259. procedure TDebugTestForm.DBGState(Sender: TObject);
  260. var
  261. n: Integer;
  262. begin
  263. case FDebugger.State of
  264. dsNone :lblState.Caption := 'dsNone ';
  265. dsIdle :lblState.Caption := 'dsIdle ';
  266. dsStop :lblState.Caption := 'dsStop ';
  267. dsPause: begin
  268. lblState.Caption := 'dsPause';
  269. txtLog.Lines.Add('[locals]');
  270. for n := 0 to FDebugger.Locals.Count - 1 do
  271. begin
  272. txtLog.Lines.Add(FDebugger.Locals.Names[n] + ':'+ FDebugger.Locals.Values[n]);
  273. end;
  274. end;
  275. dsRun :lblState.Caption := 'dsRun ';
  276. dsError:lblState.Caption := 'dsError';
  277. else
  278. lblState.Caption := '?';
  279. end;
  280. end;
  281. initialization
  282. {$I debugtestform.lrs}
  283. end.