⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdevdwarfdebugger.pas

📁 一个不出名的GBA模拟器
💻 PAS
字号:
//////////////////////////////////////////////////////////////////////
//                                                                  //
// jdevDwarfDebugger.pas: DWARF tree viewer                         //
//   Displays the hierarchy of a DWARF segment                      //
//                                                                  //
// The contents of this file are subject to the Bottled Light       //
// Public License Version 1.0 (the "License"); you may not use this //
// file except in compliance with the License. You may obtain a     //
// copy of the License at http://www.bottledlight.com/BLPL/         //
//                                                                  //
// Software distributed under the License is distributed on an      //
// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   //
// implied. See the License for the specific language governing     //
// rights and limitations under the License.                        //
//                                                                  //
// The Original Code is the Mappy VM User Interface, released       //
// April 1st, 2003. The Initial Developer of the Original Code is   //
// Bottled Light, Inc. Portions created by Bottled Light, Inc. are  //
// Copyright (C) 2001-2003 Bottled Light, Inc. All Rights Reserved. //
//                                                                  //
// Author(s):                                                       //
//   Michael Noland (joat), michael@bottledlight.com                //
//                                                                  //
// Changelog:                                                       //
//   1.0: First public release (April 1st, 2003)                    //
//                                                                  //
// Notes:                                                           //
//   This has never been in a release version of MVM and its only   //
//   useful for quick debugging tasks, its not very robust.         //
//                                                                  //
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
unit jdevDwarfDebugger; //////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
interface ////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, dwarfUtils, ExtCtrls, StdCtrls, nexus;

//////////////////////////////////////////////////////////////////////

type
  TjdevDwarfDebug = class(TForm)
    tree: TTreeView;
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormHide(Sender: TObject);
    procedure treeClick(Sender: TObject);
  private
    { Private declarations }
    doneola: boolean;
  public
    { Public declarations }
    procedure PrintNode(node: PDwarfNode; dnode: TTreeNode);
    procedure PrintAttributes(node: PDwarfNode; dnode: TTreeNode);
  end;

//////////////////////////////////////////////////////////////////////

var
  jdevDwarfDebug: TjdevDwarfDebug;

//////////////////////////////////////////////////////////////////////
implementation ///////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

{$R *.DFM}

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.PrintNode(node: PDwarfNode; dnode: TTreeNode);
var
  temp: TTreeNode;
begin
  while node <> nil do begin
    if doneola then Exit;
   // if node^.tag = DW_TAG_variable then begin
      temp := tree.Items.AddChild(dnode, DwarfTagToString(node^.tag));
      PrintAttributes(node, temp);
//    end else temp := dnode;

    if node.hasChildren then
      PrintNode(node^.kids, temp);
    node := node^.next;



    if Random(256) = 0 then Application.ProcessMessages;
  end;
end;

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.FormShow(Sender: TObject);
var
  i: integer;
begin
  if dwarf = nil then Exit;
  tree.Items.BeginUpdate;
  for i := 0 to dwarf.CompUnits.Count - 1 do begin
    PrintNode(TCompilationUnit(dwarf.CompUnits.Items[i]).rootNode, nil);
  end;
  tree.Items.EndUpdate;
end;

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.PrintAttributes(node: PDwarfNode; dnode: TTreeNode);
var
  attrib: PDwarfAttribute;
  st: string;
begin
  attrib := node^.attribs;
  while attrib <> nil do begin
    case attrib^.format of
      DW_FORM_addr: st := 'address $' + IntToHex(attrib^.address, 8);
      DW_FORM_block, DW_FORM_block1, DW_FORM_block2, DW_FORM_block4: st := 'block of size ' + IntToStr(attrib^.block.size);
      DW_FORM_sdata, DW_FORM_udata, DW_FORM_data1, DW_FORM_data2, DW_FORM_data4, DW_FORM_data8: st := 'data $' + IntToHex(attrib^.data, 8);
      DW_FORM_string, DW_FORM_strp: st := attrib^.st;
      DW_FORM_flag: if attrib^.flag then st := 'TRUE' else st := 'FALSE';
      DW_FORM_ref_addr: st := 'offset FINDME $' + IntToHex(attrib^.offset, 8);
      DW_FORM_ref_udata, DW_FORM_ref1, DW_FORM_ref2, DW_FORM_ref4, DW_FORM_ref8: st := 'offset $' + IntToHex(attrib^.offset, 8);
    end;

    tree.Items.AddChild(dnode, Format('%-30s', [DwarfAttributeToString(attrib^.name)]) + ' ' + st);
    attrib := attrib^.next;
  end;
end;

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.Timer1Timer(Sender: TObject);
begin
  doneola := true;
end;

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.Button1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  doneola := true;
end;

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.FormHide(Sender: TObject);
begin
  doneola := true;
end;

//////////////////////////////////////////////////////////////////////

procedure TjdevDwarfDebug.treeClick(Sender: TObject);
begin
  doneola := true;
end;

//////////////////////////////////////////////////////////////////////

end.

//////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -