Author Topic: zTrace version 3.00  (Read 487 times)

Patrice Terrier

  • Administrator
  • *****
  • Posts: 350
    • View Profile
    • zapsolution
zTrace version 3.00
« on: April 18, 2017, 07:00:57 pm »
zTrace 3.00 (for 64-bit only)

This Visual Studio 2017 community project, has been totaly reworked to reduce the size down from 91 to 14 Kb.
(with the same technic used to produce the tiny MBox64 OpenGL visual plugins.)

zTrace is a small DLL utility to display debugging information into a popup window tool, and/or a text file.
It uses a distinct thread to work in parallel of the current application you want to debug.

zTrace is very useful at development time to check whether a program operates properly.
It has been modeled onto the WinDev's Trace API, the original Win32 version was written in PowerBASIC.

I first wrote zTrace to debug my addon graphic DLL tools, but it works also very well with any 32-bit or 64-bit EXE.
When i took the decision to convert WinLIFT and GDImage to C++, it was the first on my list, because i couldn't develop anymore without it.

zTrace uses exclusively the core flat API, that is the only common denominator to all the languages i use, and the only way to get rid of extra dependencies.
The source code is provided in pure SDK coding style like documented into Charles Petzold 5th edition (the SDK coder Bible).

zTrace is UNICODE based.

Syntax to use:
zTrace(L"Wide String Information")

Parameter detail:
one single unicode (WCHAR) string, holding the information to display in the trace window.

Trace window:
The information passed as parameter is displayed on the next line of the zTrace window.
The trace window is automatically opened when zTrace is called, by default, this window is opened at the top left corner of the screen.
The zTrace window shuts down automatically when you close the application being debugged.

zDebug.txt report:
Works exactly like the zTrace window, except that the information is written to a text file.
The report is automatically created when zDebug is called, it is saved into the same folder than the debugged application.
zDebug can be used alone or combined with zTrace (when the option is checked in the popup menu).
zDebug is very handy when the debugged application shuts down unexpectedly or when the application as a short life duration, that won't give you enough time to read what is written in the zTrace window.
A new fresh zDebug.txt is created each time you start a new zDebug session.

Contextual popup menu (right mouse click on the trace window):
"Use horizontal scrollbar", show or hide the horizontal scrollbar.
"Send selection to printer", print the selected lines (or the whole list when none).
"Copy selection to clipboard", copy the selected lines (or the whole list when none) to clipboard.
"Clear content", clear the content of the Trace window.
"Trace window TopMost", open the Trace window on top of all the other windows (including the windows from the other applications).
"Create zDebug.txt report", the zDebug.txt report is created into the debugged application's folder.
"Save window coordinates", store the size and position of the zTrace window for the next session.

Screen shot:



Helper function, for EXPLICIT linking:
Code: [Select]
#define long_proc typedef long (__stdcall *zProc)

long zTrace(IN WCHAR* sPtr) {
    long nRet = 0;
    static HMODULE hDll;
    if (hDll == 0) {
        if (sizeof(LONG_PTR) == 8) {
            hDll = LoadLibrary(L"zTrace64");;
        }
        else {
            hDll = LoadLibrary(L"zTrace32");
        }
    }
    if (hDll) {
        long_proc(WCHAR*);
        static zProc hProc;
        if (hProc == 0) { hProc = (zProc)GetProcAddress(hDll, "zTrace"); }
        if (hProc) { nRet = hProc(sPtr); }
    }
    return nRet;
}

I want to say thank you to Fred and James for letting me know how to reduce drastically the size of a 64-bit application.


Settings used to create this tiny 14 Kb 64-bit DLL

zTrace Property Pages
The calling Convention for 64-bit is always using __fastcall (/Gr).
And in 64-bit no need to use a .def file to avoid the decorated names.



















Include + Pragma
Code: [Select]
#include <windows.h>
#include "..\TCLib\Strings.cpp"

#pragma warning(disable: 4996) // remove Unsafe notifications
#pragma warning(disable: 4312) // remove warning C4312: 'type cast': conversion from 'long' to 'HMENU' of greater size

History
See it here: http://www.jose.it-berater.org/smfforum/index.php?topic=3092.0

04-26-2017
Fix:
delete [] SelItem;
was unexpectedly missing from the case IDM_Print

Enhancement:
New menu option: "Use Unicode in zDebug.txt"
to switch between ANSI or UNICODE
in case of ANSI, a UTF-8 BOM header is now being used.
UTF-8 BOM is a sequence of bytes (EF BB BF) that allows the reader to identify a file as being encoded in UTF-8.

04-27-2017
I have merged Andrei changes into this new version, with:
further code clean up,
new font set for both the listbox window and the printer,
switched back to XP compatibility,
no more TCLib linking that has been removed.

With more features, and further code optimization, the resulting size of the 64-bit Unicode DLL, is now only 11 Kb.
« Last Edit: April 27, 2017, 05:57:04 pm by Patrice Terrier »

Patrice Terrier

  • Administrator
  • *****
  • Posts: 350
    • View Profile
    • zapsolution
Re: zTrace version 3.00
« Reply #1 on: April 26, 2017, 08:58:41 am »
from Andrey Unis

By the way with only 14Kb, it could be used to debug any unicode 64-bit application...
Can make 11kb...
By the way, there are few mistakes...
function zDebug() includes NUL characters to log file
WideCharToMultiByte(CP_ACP, 0, sMessage, -1, buffer, BufferSize - 1, 0, 0);
(but better remake this function to support unicode chars (for example chinese language))

function ToolProc()
Code: [Select]
    case WM_GETMINMAXINFO:
         MoveMemory(&pMM, (MINMAXINFO*) lParam, sizeof(pMM));
         SetRect(&rc, 0, 0, MIN_WIDTH, MIN_HEIGHT);
         AdjustWindowRectEx(&rc, dwStyle, FALSE, dwExStyle);  // Adjust Window To True Requested Size
         pMM.ptMinTrackSize.x = rc.right;
         pMM.ptMinTrackSize.y = rc.bottom;
         break;
fix
Code: [Select]
case WM_GETMINMAXINFO:
SetRect(&rc, 0, 0, MIN_WIDTH, MIN_HEIGHT);
AdjustWindowRectEx(&rc, WND_Style, FALSE, WND_ExStyle);  // Adjust Window To True Requested Size
((LPMINMAXINFO)lParam)->ptMinTrackSize.x = rc.right;
((LPMINMAXINFO)lParam)->ptMinTrackSize.y = rc.bottom;
break;

case IDM_Print:
  ...
  long* SelItem = new long[nSelItems];
memory leak, missed: delete [] SelItem ;

my variant (11kb) attached
« Last Edit: April 26, 2017, 09:03:18 am by Patrice Terrier »

Patrice Terrier

  • Administrator
  • *****
  • Posts: 350
    • View Profile
    • zapsolution
Re: zTrace version 3.00
« Reply #2 on: April 26, 2017, 03:28:22 pm »
The first post of this thread has been updated with a new version.

Fix:
delete [] SelItem;
was unexpectedly missing from the case IDM_Print

Enhancement:
New menu option: "Use Unicode in zDebug.txt"
to switch between ANSI or UNICODE
in case of ANSI, a UTF-8 BOM header is now being used.
UTF-8 BOM is a sequence of bytes (EF BB BF) that allows the reader to identify a file as being encoded in UTF-8.

Thanks to Andrey Unis who reported these to me.

Patrice Terrier

  • Administrator
  • *****
  • Posts: 350
    • View Profile
    • zapsolution
Re: zTrace version 3.00
« Reply #3 on: April 27, 2017, 05:56:32 pm »
The first post of this thread has been updated with a new version.

I have merged Andrei changes into this new version, with:
further code clean up,
new font set for both the listbox window and the printer,
switched back to XP compatibility,
no more TCLib linking that has been removed.

With more features, and further code optimization, the resulting size of the 64-bit Unicode DLL, is now only 11 Kb.

Emil Weiss

  • Full Member
  • ***
  • Posts: 123
    • View Profile
Re: zTrace version 3.00
« Reply #4 on: May 04, 2017, 02:07:04 am »
how use the lib with PB?
Code: [Select]
DECLARE FUNCTION zTrace LIB "zTrace32.DLL" ALIAS "zTrace" (zMessage AS ASCIIZ) AS LONG
and then?

Code: [Select]
LOCAL ztrace_Lib           AS LONG   
ztrace_Lib = LoadLibrary("zTrace32.dll")   


and now? i can not see any Window.
-----------------------------------------
that is what i do with my own tracer if want debug print any..
from old VB6 code.

Code: [Select]
Private Sub cP_ItemHighlight(ItemNumber As Long, bEnabled As Boolean, bSeparator As Boolean)

    Trace "Highlighted  Item=" & ItemNumber & ",Caption=" & cp.Caption(ItemNumber) & ", Enabled=" & bEnabled & ", Separator = " & bSeparator

End Sub

i think your do the same or?

greets
 
« Last Edit: May 04, 2017, 02:48:43 am by Emil Weiss »

Patrice Terrier

  • Administrator
  • *****
  • Posts: 350
    • View Profile
    • zapsolution
Re: zTrace version 3.00
« Reply #5 on: May 05, 2017, 09:15:37 am »
Emil

In PB
DECLARE FUNCTION zTrace LIB "zTrace32.DLL" ALIAS "zTrace" (zMessage AS ASCIIZ) AS LONG
is to be used for IMPLICIT linking, not explicit.

If you want to use EXPLICIT linking with PB, you have to do this:
(assuming that the DLL is in the current path or within the same folder than the EXE).
Code: [Select]
funtion zTrace(zMessage as asciiz) as long
    long nRet
    static hDll, hProc as dword
    if (hDll = 0) then
        hDll = LoadLibrary("zTrace")
    end if
    if (hDll) {
        if (hProc = 0) then hProc = GetProcAddress(hDll, "zTrace")
        if (hProc) then
            call dword hProc USING zTrace(zMessage) to nRet
        end if
    end if
    function = nRet
end function

And the window shows up only when you use zTrace with an ANSI asciiz that is not NULL.

For example in your code you can do this
Code: [Select]
local rNumber as single
rNumber = 12.45!
zTrace("We have been there")
zTrace("And the value of rNumber =" + str$(rNumber))

And with PB10 like with C++, the zTrace code is compiled into your resulting code, only when you use it (compiler optimization).

« Last Edit: May 05, 2017, 10:39:50 am by Patrice Terrier »