[Lazarus] disable the debugger capturing the OutputDebugString() messages
Sven Barth
pascaldragon at googlemail.com
Sun Jul 18 20:28:00 CEST 2010
Hi!
On 18.07.2010 19:52, Bernd wrote:
> 2010/7/18 Sven Barth<pascaldragon at googlemail.com>:
>> Hi again!
>>
>> I took the time to implement a OutputToDebugMonitor myself. It prints the
>> message directly to e.g. DebugView even if a debugger like GDB is attached
>> to the process.
>
> Wow! That was fast! I didn't even consider implementing this myself
> after looking at the code for a while.
I was bored...
And afterall it was a pretty simple conversion from C to Pascal... not
much thinking involved ^^
> (* first try to open the mutex, if that fails call OutputDebugString, which
> will create that for us (we can't do that ourselves easily) *)
> mutex := OpenMutexW(SYNCHRONIZE or READ_CONTROL or MUTANT_QUERY_STATE, True,
> PWideChar(DBWinMutex));
> if mutex = 0 then begin
> OutputDebugStringA(PChar(aStr));
> Exit;
> end;
>
> Does this really create the mutex or wouldn't the original
> OutputDebugString() just raise the debug exception and invoke the
> debugger and then return before it even comes to the point where the
> mutex is needed?
Good point... in that case there are only two things we can do:
1) Rely on the fact that OutputDebugString got at least called once
since the system started while no debugger was attached.
2) Create the mutex by ourselves if we can't open it.
I personally would chose 1, because for 2 I don't know whether all
Windows versions create the Mutex with the same security attributes as
ReactOS does.
To ensure that OutputDebugString was "successfully" called at least once
we could write a really simple (maybe even C) application that calls
OutputDebugString and which is started from our process (thus no
debugger attached). This is done if OpenMutexW fails. After that we try
to open the mutex again and if that fails as well we'll have to give up
(or simply call OutputDebugString to get the message anywhere).
Better: this dummy process is started once at the beginning of your own
application and thus OpenMutexW should be successful no matter what (if
not we simply exit the OutputToDebugMonitor procedure).
Regards,
Sven
More information about the Lazarus
mailing list