· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Аналог DbgPrint для user mode

Посл.отвђт Сообщенiе


Дата: Авг 13, 2004 15:47:10

Есть ли полный аналог dbgprint для user mode outputdebugstring не позволяет использовать %d, %s и т.д.


Дата: Авг 14, 2004 11:30:31

Сам понял что нет :(

Сделал так:
#if DBG

#define DebugOut(_x_) DebugOut1(_x_);

#else

#define DebugOut(_x_)

#endif


#if DBG
void DebugOut1(const TCHAR* str, ...)
{
    TCHAR buff[1024];

    va_list parameters;
    va_start(parameters, str);

    wvsprintf(buff, str, parameters);

    va_end(parameters);
    
    OutputDebugString(buff);
}
#endif


Однако макрос DebugOut не корректен - передается только один параметр. Как передать все ?


Дата: Авг 15, 2004 14:37:56 · Поправил: S_T_A_S_

А если так:
#if DBG

void DebugOut(const TCHAR* str, ...)
{
    TCHAR buff[1024];

    va_list parameters;
    va_start(parameters, str);

    wvsprintf(buff, str, parameters);

    va_end(parameters);
    
    OutputDebugString(buff);
}

#else

#define DebugOut(_x_)

#endif


Вот ещё вариант на FASM'е. Вывод происходит в дополнительное окно EDIT (так как вывожу не только сообщения об ошибках, но и всякую дополнительную инфу), но можно легко адаптировать под любые нужды. Меняет только регистр eax и имеет весьма небольшой размер.

Параметры передаются так: непосредственно после команды call распологается строка-формат заканчивающаяся нулём, остальные параметры передаются через стек, как для wprintf. Подпрограммка сама очищает стек и возвращает управление после строки.

Есть так же макрос для упрощения работы и избавления от возможных ошибок (несоответствие количества параметров для wsprintf и символов "%")

Пример использования:
LogWindow.Write 'Log window created \nHandle=%08lXh',dword[ebp]

Символы '\n' заменяются на символы перевода строки во время компиляции.
Строка-формат должна быть не более 255 символов, длина не проверяется.

; можно без структуры обойтись,
; заменив _PUSHA.eax и sizeof._PUSHA соответствующими цифрами

struc    _PUSHA
{
    .edi    dd ?
    .esi    dd ?
    .ebp    dd ?
    .esp    dd ?
    .ebx    dd ?
    .edx    dd ?
    .ecx    dd ?
    .eax    dd ?
}

virtual    at 0
    _PUSHA    _PUSHA
    sizeof._PUSHA = $
end virtual


;PROC    Log.Write
label    Log.Write

    pusha
    lea    esi,[esp+sizeof._PUSHA]
    lodsd    [esi]        ;;  address after CALL
                       
    mov    edx,esp
    dec    dh        ;;  256 bytes buffer for wvsprintf
    mov    esp,edx
;    push    0A0D0D0Dh    ;;  new line

    push    esi        ;;  esi = address of VA_LIST for wvsprintf
    push    eax        ;;  pFormat for wvsprintf

    xchg    eax,esi
    push    1
    pop    edi        ;; ardument counter

@@:    lodsb    [esi]
    or    al,al
    jz    .eof
    cmp    al,'%'
    jnz    @b
    inc    edi
    jmp    @b
    
.eof:    stdcall    [wvsprintf], edx

    ; этот код можно поменять на OutputDebugString
    mov    ebx,[SendMessage]
    mov    ebp,[Log.hCanvas]    ; <<======= handle окна EDIT
    stdcall    ebx,ebp,EM_SETSEL,-1,-1
    stdcall    ebx,ebp,EM_REPLACESEL,0,esp    ; esp = buffer

;    pop    ecx        ;;  remove 0A0D0D0Dh DWORD
    xchg    eax,esp
    inc    ah
    xchg    eax,esp

    mov    [esp+sizeof._PUSHA],esi    ;;  we'll return after the string
    mov    [esp+_PUSHA.eax],edi

    popa
    lea    eax,[esp+eax*4]
    xchg    eax,esp
    jmp    dword[eax]
;ENDP


macro    Log.Write     form,[arg]
{
    common    local    args,char,.text
            args=0
    reverse if~arg eq
            Push arg
            args=args+1
            end if
    common    call    Log.Write
        .text    db form,0
       
	repeat	$-.text-1
		load	char word from .text+%-1
		if char='\n'
			store word 0A0Dh at .text+%-1
		end if
		if char and 255='%'
			args=args-1
		end if
	end repeat
        if args<>0
        display '  ERROR:  "%" mismatch number of arguments.',10
        !BUG    ; это должно вызвать ошибку, т.е. просто любой Неправильный набор символов
        end if
} 


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088