Learning more from your debug output
Learning more from your debug output
In the context Nick Hodges's post on memory usage, here are some tweaks for OutputDebugString which I've been using for a few years to help debug trace live services running in production environment. The memory consumption code looks like the spitting image of the stackoverflow post, so I probably gleaned it from there, or possibly from
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/monitormemorymanager_xml.html.
or the MemoryManager usage tracker sample:
http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE4/Delphi/RTL/Usage%20Tracker/MemoryManagerUsageTracker.pas
If you peruse the documentation -
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/monitormemorymanager_xml.html
and
http://docwiki.embarcadero.com/RADStudio/XE4/en/Monitoring_Memory_Usage
also give hints about GetMemoryMap which supposedly helps you track memory for the entire process, in case you have sub-processes or COM stuff to deal with.
I haven't dabbled there, though.
---
unit CustomDebugOut;
// Lars Fosdal
interface
uses
Windows, SysUtils, DateUtils;
procedure OutputDebugString(aStr:PChar); Inline; overload;
procedure OutputDebugString(const aStr:String); Inline; overload;
function CurrentThreadId:String; Inline;
function CurrentTime:String; Inline;
function MemoryUsed: cardinal; Inline;
implementation
function CurrentThreadId:String; Inline;
begin
Result := IntToStr(GetCurrentThreadId);
end;
function CurrentTime:String; Inline;
begin
Result := FormatDateTime('hh:nn:ss,zzz ', Now);
end;
function MemoryUsed: cardinal; Inline;
var
MMS: TMemoryManagerState;
Block: TSmallBlockTypeState;
begin
GetMemoryManagerState(MMS);
Result := MMS.TotalAllocatedMediumBlockSize + MMS.TotalAllocatedLargeBlockSize;
for Block in MMS.SmallBlockTypeStates
do Result := Result + (Block.UseableBlockSize * Block.AllocatedBlockCount);
Result := Result DIV 1024;
end;
procedure OutputDebugString(aStr:PChar); Inline;
begin
Windows.OutputDebugString(pChar('{'
+ CurrentTime // time
+ '('+CurrentThreadId+')' // thread
+ ' '+ IntToStr(MemoryUsed) +'k' // memory in k
+ '} ' + aStr));
end;
procedure OutputDebugString(const aStr:String); inline;
begin
OutputDebugString(pChar(aStr));
end;
end.
----
http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE4/Delphi/RTL/Usage%20Tracker/MemoryManagerUsageTracker.pas
In the context Nick Hodges's post on memory usage, here are some tweaks for OutputDebugString which I've been using for a few years to help debug trace live services running in production environment. The memory consumption code looks like the spitting image of the stackoverflow post, so I probably gleaned it from there, or possibly from
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/monitormemorymanager_xml.html.
or the MemoryManager usage tracker sample:
http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE4/Delphi/RTL/Usage%20Tracker/MemoryManagerUsageTracker.pas
If you peruse the documentation -
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/monitormemorymanager_xml.html
and
http://docwiki.embarcadero.com/RADStudio/XE4/en/Monitoring_Memory_Usage
also give hints about GetMemoryMap which supposedly helps you track memory for the entire process, in case you have sub-processes or COM stuff to deal with.
I haven't dabbled there, though.
--
unit CustomDebugOut;
// Lars Fosdal
interface
uses
Windows, SysUtils, DateUtils;
procedure OutputDebugString(aStr:PChar); Inline; overload;
procedure OutputDebugString(const aStr:String); Inline; overload;
function CurrentThreadId:String; Inline;
function CurrentTime:String; Inline;
function MemoryUsed: cardinal; Inline;
implementation
function CurrentThreadId:String; Inline;
begin
Result := IntToStr(GetCurrentThreadId);
end;
function CurrentTime:String; Inline;
begin
Result := FormatDateTime('hh:nn:ss,zzz ', Now);
end;
function MemoryUsed: cardinal; Inline;
var
MMS: TMemoryManagerState;
Block: TSmallBlockTypeState;
begin
GetMemoryManagerState(MMS);
Result := MMS.TotalAllocatedMediumBlockSize + MMS.TotalAllocatedLargeBlockSize;
for Block in MMS.SmallBlockTypeStates
do Result := Result + (Block.UseableBlockSize * Block.AllocatedBlockCount);
Result := Result DIV 1024;
end;
procedure OutputDebugString(aStr:PChar); Inline;
begin
Windows.OutputDebugString(pChar('{'
+ CurrentTime // time
+ '('+CurrentThreadId+')' // thread
+ ' '+ IntToStr(MemoryUsed) +'k' // memory in k
+ '} ' + aStr));
end;
procedure OutputDebugString(const aStr:String); inline;
begin
OutputDebugString(pChar(aStr));
end;
end.
--
http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE4/Delphi/RTL/Usage%20Tracker/MemoryManagerUsageTracker.pas
Comments
Post a Comment