DEBUG api

Тема в разделе "WASM.BEGINNERS", создана пользователем spa, 22 июл 2008.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. CreateProcess(NULL, "3.exe", NULL, NULL, FALSE, DEBUG_PROCESS & DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi);
    2.  
    3. WaitForDebugEvent(de,INFINITE)
    Процесс нормально создаеться, но при этом WaitForDebugEvent не выполняеться типо неверный дискриптор. Что может быть причиной?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Не & (and), а + или | (or)
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    Ага перемудрил.


    Странно теперь аксес волейшен вылетает, причем опять на WaitForDebugEvent
     
  4. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    SPA
    Может быть он вылетает потому что вы передаёте не указатель ( &de ), или не заполняете (или заполняете но неверно) мемберы структуры de?
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    DEEP
    Все разобрался, мой тупой косяк был.


    Теперь отлаживаемое приложение пишет "ошибка инициализации" причем 2 раза, я писал не вникая или автор статьи лопух, так можно?

    Код (Text):
    1.         switch(de.dwDebugEventCode)
    2.             {
    3.             case CREATE_THREAD_DEBUG_EVENT:
    4.         {
    5.                 MessageBox(0,"DEBUG_EVENT","CREATE_THREAD_DEBUG_EVENT",0);
    6.                 ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
    7.             break;
    8.         }
    9.  
    10.             case EXCEPTION_BREAKPOINT:
    11.         {
    12.             if(f)  
    13.         {
    14.                 ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    15.                     f=0;
    16.         }
    17.             else
    18.                 ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
    19.             break;
    20.        }
    21.             default:
    22.         {
    23.                 ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);  
    24.             break;
    25.         }
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    ???
    EXCEPTION_BREAKPOINT это не dwDebugEventCode, а код конкретного исключения, которое нужно сначала отловить по dwDebugEventCode == EXCEPTION_DEBUG_EVENT и затем уже проверять код исключения в de.EXCEPTION_DEBUG_INFO
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    а все уже не надо разобрался, забыл отписаться.


    НУ тупо в статье кусками код приводился, думал думал забил глянул код в гуле все понятно сразу стало. Всеравно спасибо всем.
     
  8. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    У меня опять проблемма, чесно говоря я силно опять не в чухивал, просто работа идет паралейно, но посмотрел с первого взгляда тупых косяков нет. Просто не лвиться загрузка либы.
    Код (Text):
    1.             case EXCEPTION_DEBUG_EVENT:
    2.         {
    3. // ОБАЮОТКА EXCEPTION_DEBUG_EVENT
    4.             switch(de.u.Exception.ExceptionRecord.ExceptionCode)
    5.                 {
    6.                                 case EXCEPTION_BREAKPOINT:
    7.                     {
    8.                         if(f)  
    9.                         {
    10.                         MessageBox(0,"EXCEPTION_BREAKPOINT first","DEBUG_EVENT",0);
    11.                         ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    12.                         f=0;
    13.                         }
    14.                         else
    15.                         ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
    16.                                 break;
    17.                     }
    18.  
    19.                                 case LOAD_DLL_DEBUG_EVENT:
    20.                     {
    21.  
    22.                         MessageBox(0,"(LPCSTR)de.u.LoadDll.lpImageName","LOAD_DLL",0);
    23.                         ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
    24.                                 break;
    25.                     }
    26.  
    27.                                 default:
    28.                     {
    29.                         ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
    30.                                 break;                 
    31.            
    32.                     }
    33.                 }
    34.             break;
    35. // конец свича ОБАЮОТКИ EXCEPTION_DEBUG_EVENT
    36.         }
    И еще вопрос если я добавлю флаг CREATE_SUSPENDED до ResumeThread можно мне ваще не как не обрабатывать WaitForDebugEvent?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SPA
    Ну ты блин даешь - то EXCEPTION_BREAKPOINT нет в тот свитч "вчухиваешь", теперь LOAD_DLL_DEBUG_EVENT в свитч по кодам исключений втюрил, УжОс !!!
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    Очень странно тк я его туда намеренно вчухал! т.е. прочитал что так надо и втюхал!
    Причем дока от билдера справочник по winApi.. Но спасибо конечно.
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    А понял!! Просто там както странно написанно, епт, неужеле обязательно было так все усложнять )) вот с этим спутал LOAD_DLL_DEBUG_INFO
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SPA
    Не знаю какую траву ты куришь ;) В результате WaitForDebugEvent ты получаешь код отладочного события в de.dwDebugEventCode и соответсвенно организуешь switch по этим кодам XXX_DEBUG_EVENT. Затем в case для каждого кода анализируешь соответсвующую этому коду структуру XXX_DEBUG_INFO и если нужно делаешь доп.switch, например по ExceptionCode для EXCEPTION_DEBUG_EVENT.
    PS: Не представляю с какого перепоя или затраха на трех работах можно перепутать совершенно разные свичи и коды EXCEPTION_XXX и XXX_DEBUG_EVENT :lol:
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    Да ладно ты, есть обьяктивные причины которые позволяют мне так косячить )
    И еще надо документацию получше читать.

    Код (Text):
    1.             case LOAD_DLL_DEBUG_EVENT:
    2.         {
    3.             MessageBoxW(0,(LPCWSTR)de.u.LoadDll.lpImageName,0,0);
    4.             break;
    5.         }
    Нифига не выводит ( хотя пробывал проверять флаг на юникод. Тут вроде и косяку влезть некуда.
     
  14. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Один не должен полагаться на LOAD_DLL_DEBUG_INFO.lpImageName в данном случае. Там либо нуль, либо какой-то адрес. В адресном пространстве отлаживаемого приложения по этому адресу лежит либо нуль, либо указатель на строку с именем. Звучит не очень-то надёжно, да?
    Можно определить имя файла по LOAD_DLL_DEBUG_INFO.hFile посредством ZwQueryInformationFile(..., FileNameInformation).
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Sol_Ksacap
    0_0 т.е. его по сути нельзя использовать? Для уверенного получения информации. Жаль. Попробую заюзать ZwQueryInformationFile.