lazstacktrace: Utility program to convert stacktraces address into symbol names

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1826 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-08-23 09:08:30 +00:00
parent f92b46fd23
commit b4eba2dfa3
6 changed files with 436 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@ -0,0 +1,235 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<General>
<MainUnit Value="0"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
<ActiveWindowIndexAtStart Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1" Active="Default">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="LCL"/>
</Item1>
</RequiredPackages>
<Units Count="4">
<Unit0>
<Filename Value="lazstacktrace.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="lazstacktrace"/>
<UsageCount Value="21"/>
</Unit0>
<Unit1>
<Filename Value="mainform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="mainform"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="30"/>
<CursorPos X="18" Y="33"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../../../lazarus/lcl/include/control.inc"/>
<WindowIndex Value="0"/>
<TopLine Value="2262"/>
<CursorPos X="1" Y="2286"/>
<UsageCount Value="10"/>
<DefaultSyntaxHighlighter Value="Delphi"/>
</Unit2>
<Unit3>
<Filename Value="/usr/share/fpcsrc/packages/fcl-process/src/process.pp"/>
<UnitName Value="process"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="48" Y="25"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="Delphi"/>
</Unit3>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="mainform.pas"/>
<Caret Line="56" Column="1" TopLine="30"/>
</Position1>
<Position2>
<Filename Value="mainform.pas"/>
<Caret Line="57" Column="1" TopLine="30"/>
</Position2>
<Position3>
<Filename Value="mainform.pas"/>
<Caret Line="55" Column="1" TopLine="30"/>
</Position3>
<Position4>
<Filename Value="mainform.pas"/>
<Caret Line="56" Column="1" TopLine="30"/>
</Position4>
<Position5>
<Filename Value="mainform.pas"/>
<Caret Line="57" Column="1" TopLine="30"/>
</Position5>
<Position6>
<Filename Value="mainform.pas"/>
<Caret Line="55" Column="1" TopLine="30"/>
</Position6>
<Position7>
<Filename Value="mainform.pas"/>
<Caret Line="56" Column="1" TopLine="30"/>
</Position7>
<Position8>
<Filename Value="mainform.pas"/>
<Caret Line="57" Column="1" TopLine="30"/>
</Position8>
<Position9>
<Filename Value="mainform.pas"/>
<Caret Line="58" Column="1" TopLine="30"/>
</Position9>
<Position10>
<Filename Value="mainform.pas"/>
<Caret Line="61" Column="1" TopLine="30"/>
</Position10>
<Position11>
<Filename Value="mainform.pas"/>
<Caret Line="62" Column="1" TopLine="30"/>
</Position11>
<Position12>
<Filename Value="mainform.pas"/>
<Caret Line="63" Column="1" TopLine="30"/>
</Position12>
<Position13>
<Filename Value="mainform.pas"/>
<Caret Line="64" Column="1" TopLine="30"/>
</Position13>
<Position14>
<Filename Value="mainform.pas"/>
<Caret Line="65" Column="1" TopLine="30"/>
</Position14>
<Position15>
<Filename Value="mainform.pas"/>
<Caret Line="68" Column="1" TopLine="30"/>
</Position15>
<Position16>
<Filename Value="mainform.pas"/>
<Caret Line="73" Column="7" TopLine="30"/>
</Position16>
<Position17>
<Filename Value="mainform.pas"/>
<Caret Line="68" Column="1" TopLine="30"/>
</Position17>
<Position18>
<Filename Value="mainform.pas"/>
<Caret Line="64" Column="17" TopLine="30"/>
</Position18>
<Position19>
<Filename Value="mainform.pas"/>
<Caret Line="66" Column="1" TopLine="30"/>
</Position19>
<Position20>
<Filename Value="mainform.pas"/>
<Caret Line="67" Column="1" TopLine="30"/>
</Position20>
<Position21>
<Filename Value="mainform.pas"/>
<Caret Line="68" Column="1" TopLine="30"/>
</Position21>
<Position22>
<Filename Value="mainform.pas"/>
<Caret Line="64" Column="93" TopLine="30"/>
</Position22>
<Position23>
<Filename Value="mainform.pas"/>
<Caret Line="66" Column="1" TopLine="30"/>
</Position23>
<Position24>
<Filename Value="mainform.pas"/>
<Caret Line="67" Column="1" TopLine="30"/>
</Position24>
<Position25>
<Filename Value="mainform.pas"/>
<Caret Line="71" Column="1" TopLine="30"/>
</Position25>
<Position26>
<Filename Value="mainform.pas"/>
<Caret Line="33" Column="18" TopLine="30"/>
</Position26>
<Position27>
<Filename Value="mainform.pas"/>
<Caret Line="32" Column="18" TopLine="29"/>
</Position27>
<Position28>
<Filename Value="mainform.pas"/>
<Caret Line="33" Column="18" TopLine="30"/>
</Position28>
<Position29>
<Filename Value="mainform.pas"/>
<Caret Line="34" Column="18" TopLine="31"/>
</Position29>
<Position30>
<Filename Value="mainform.pas"/>
<Caret Line="33" Column="18" TopLine="30"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="10"/>
<Target>
<Filename Value="lazstacktrace"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,21 @@
program lazstacktrace;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, mainform
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Binary file not shown.

View File

@ -0,0 +1,99 @@
object Form1: TForm1
Left = 313
Height = 447
Top = 186
Width = 400
Caption = 'Stacktrace resolver'
ClientHeight = 447
ClientWidth = 400
LCLVersion = '0.9.31'
object editGDBPath: TFileNameEdit
Left = 104
Height = 25
Top = 56
Width = 264
FileName = '/usr/bin/gdb'
DialogOptions = []
FilterIndex = 0
HideDirectories = False
ButtonWidth = 23
NumGlyphs = 0
MaxLength = 0
TabOrder = 0
end
object Label1: TLabel
Left = 11
Height = 18
Top = 63
Width = 83
Caption = 'Path to GDB:'
ParentColor = False
end
object Label2: TLabel
Left = 9
Height = 39
Top = 9
Width = 381
AutoSize = False
Caption = 'This Program resolves stacktraces generated by FPC apps using GDB. It adds the symbol names to addresses.'
ParentColor = False
WordWrap = True
end
object Label3: TLabel
Left = 11
Height = 18
Top = 120
Width = 78
Caption = 'Stack trace:'
ParentColor = False
end
object memoStacktrace: TMemo
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 8
Height = 260
Top = 143
Width = 387
Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Right = 5
BorderSpacing.Bottom = 44
TabOrder = 1
end
object buttonResolveSymbols: TButton
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 136
Height = 30
Top = 412
Width = 123
Anchors = [akLeft, akBottom]
BorderSpacing.Bottom = 5
Caption = 'Resolve Symbols'
OnClick = buttonResolveSymbolsClick
TabOrder = 2
end
object Label4: TLabel
Left = 11
Height = 18
Top = 95
Width = 109
Caption = 'Path to Program:'
ParentColor = False
end
object editProgramPath: TFileNameEdit
Left = 128
Height = 25
Top = 95
Width = 240
FileName = '/home/felipe/Programas/lazarus-ccr/examples/androidlcl/android/libs/armeabi/libandroidlcltest.so'
DialogOptions = []
FilterIndex = 0
HideDirectories = False
ButtonWidth = 23
NumGlyphs = 0
MaxLength = 0
TabOrder = 3
end
end

View File

@ -0,0 +1,81 @@
unit mainform;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, EditBtn,
StdCtrls, process;
type
{ TForm1 }
TForm1 = class(TForm)
buttonResolveSymbols: TButton;
editGDBPath: TFileNameEdit;
editProgramPath: TFileNameEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
memoStacktrace: TMemo;
procedure buttonResolveSymbolsClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.buttonResolveSymbolsClick(Sender: TObject);
var
GDBProcess: TProcess;
GDBOutput: TStringList;
Str, StackStr, lCurAddress: string;
lAddressPos: SizeInt;
i: Integer;
StrGdbOutput: String;
begin
GDBProcess := TProcess.Create(nil);
GDBOutput := TStringList.Create;
memoStacktrace.Lines.BeginUpdate;
try
for i := 0 to memoStacktrace.Lines.Count - 1 do
begin
// Obtain the stack address or skip this line
StackStr := memoStacktrace.Lines.Strings[i];
lAddressPos := Pos('$', StackStr);
if lAddressPos <= 0 then Continue;
lCurAddress := Copy(StackStr, lAddressPos+1, 8);
// Run GDB to get the symbol name
Str := Format('%s --batch "--eval-command=info symbol 0x%s" %s', [editGDBPath.FileName, lCurAddress, editProgramPath.FileName]);
GDBProcess.CommandLine := Str;
GDBProcess.Options := GDBProcess.Options + [poWaitOnExit, poUsePipes, poStderrToOutPut];
GDBProcess.Execute;
GDBOutput.LoadFromStream(GDBProcess.Output);
if GDBOutput.Count >= 1 then StrGdbOutput := GDBOutput.Strings[0]
else StrGdbOutput := '';
// Add the symbol name to the memo
memoStacktrace.Lines.Strings[i] := Format('%s %s', [StackStr, StrGdbOutput]);
end;
finally
GDBProcess.Free;
GDBOutput.Free;
memoStacktrace.Lines.EndUpdate;
end;
end;
end.