Ошибка First-chance exception... Invalid Handle

Тема в разделе "WASM.WIN32", создана пользователем linkmaze, 27 май 2008.

  1. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Пожалуста помогите разобраться при отладке проги myprog.exe возникает ошибка First-chance exception in myprog.exe (NTDLL.DLL) Invalid Handle. Хотя если ее запускать не под отладчиком все OK. Отлаживаю в Microsoft Visual C++, вот текст программы (взят из MSDN):
    Код (Text):
    1. #include <stdio.h>
    2. #include "winsock2.h"
    3. void main() {
    4.     WSADATA wsaData;
    5.     int iResult = WSAStartup(MAKEWORD(2,1), &wsaData);
    6.     if (iResult != NO_ERROR)
    7.       printf("Error at WSAStartup()\n");
    8.     SOCKET ConnectSocket= INVALID_SOCKET;
    9.     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    10.     if (ConnectSocket == INVALID_SOCKET) {
    11.         printf("Error at socket(): %ld\n", WSAGetLastError());
    12.         WSACleanup();
    13.         return;
    14.     }
    15.     //----------------------
    16.     // The sockaddr_in structure specifies the address family,
    17.     // IP address, and port of the server to be connected to.
    18.     sockaddr_in clientService;
    19.     clientService.sin_family = AF_INET;
    20.     clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    21.     clientService.sin_port = htons( 80);
    22.     //----------------------
    23.     // Connect to server.
    24.     if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    25.         printf( "Failed to connect.\n" );
    26.         WSACleanup();
    27.         return;
    28.     }
    29.     printf("Connected to server.\n");
    30.     WSACleanup();
    31.     return;
    32. }
    Глюк возникает на ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     
  2. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    linkmaze
    winsock32.lib или wsock32.lib что-то подобное прилинковал?
     
  3. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    В том то и дело что компилируется,линкуется и выполняется нормально а как только дело доходит до отладки -- сразу глюк. Подключена ws2_32.lib. Переменная которой присваивается результат ф-ии инициализирована. Другие программы отлаживаются без проблем.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    пробуй перед WSACleanup закрывать сокеты.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ведь если программа не отлаживается, то по умолчанию исключение "InvalidHandle" не генерируется же?

    Можно поставить бряк на NtClose перед вызовом socket(...) - тогда менее чем через десяток остановок можно будет видеть, кто хочет закрыть невалидный описатель.
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    linkmaze
    может надо IPPROTO_IP (0)?
     
  7. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Так ведь ошибка еще до WSACleanup, при создании сокета.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ну тогда попробуй MAKEWORD(2, 2), вместо 2, 1.
    Но все равно сокет лучше закрыть.
     
  9. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    ИМХО это нормально
    недавно видел именно этот ексепшин в какой-то микрософтовской проге
    это они так пишут :) через трай-ексепт
     
  10. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Может вопрос дилетантский, но как в Visual C++ можно проще поставить бряк на NtClose, кроме как через GetProcAddress (и последующей установке бряка вручную на этот адрес) и как потом найти причину искючения.
    Вот стек вызовов на момент Exception(если он может что-то прояснить)
    NTDLL! 7c90eb74()
    NTDLL! 7c90eb94()
    DCSWS2! 1000104b()
    NTDLL! 7c9011a7()
    NTDLL! 7c91cbab()
    NTDLL! 7c916178()
    NTDLL! 7c9162da()
    KERNEL32! 7c801bb9()
    KERNEL32! 7c801d6e()
    KERNEL32! 7c801da4()
    badfdcca()
     
  11. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Не знаю)
    Я бы в Olly такое стал смотреть.

    Говоришь, FirstChance-Exception? Так может, как уже было сказано z0mailbox, это исключение предусмотрено, и оно таки отлавливается в недрах какой-нибудь системной библиотеки? Если всё же не отлавливается, а разбираться нет желания, можно на время отладки добавлять векторный обработчик исключений (AddVectoredExceptionHandler), который будет втихую поедать InvalidHandle-исключения (возвращая EXCEPTION_CONTINUE_EXECUTION).
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    обнулять ее тоже было бы неплохо.
     
  13. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    С отладкой выход есть (просто продолжать далее и в появившемся окне с запросом "Pass exception on to the programm being debugged" ответить нет), но интересно все-таки в чем причина и если системная библиотека написана через try except то почему исключение вылазит только при отладке. Вроде с кодом все более менее нормально, из MSDN копирован, и выполняется (без отладки) нормально. Даже не зная в какую сторону капать.
     
  14. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Из http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx (описание CloseHandle):
    NtClose в ядре проверяет, отлаживается ли данный процесс, и если да, то бросает исключение, а если нет, то тихо игнорирует вызов.
     
  15. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Спасибо diamond теперь все вроде бы ясно.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Дык а в чем ошибка была?
    Само собой что это проявляется тольки в дебаггере.
     
  17. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    Просто у меня раньше как то таких "ошибок" при отладке других приложений не возникало.
    И с какой целью надо было реализовывать исключение в системной длл возникающее только при отладке мне не совсем понятно, тем более что его можно просто проигнорировать в отладчике. В этом и вопрос, зачем это надо и из-за чего возникает.
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    дык ты разве не умеешь читать?
    функция генерит исключение если получила в качестве аргумента невалидный хендл.
     
  19. linkmaze

    linkmaze New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2007
    Сообщения:
    60
    вобще-то читать умею и даже немножечко писать, но понять откуда взялся invalid hadle в
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    не могу. Все параметры константы, WSAStartup возвращает zero, все должно быть OK и никакого невалида на мой взгляд.
    пробовал даже
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    и
    closesocket(ConnectSocket); перед WSACleanup
    результат тот же.
    Please HELP я ж только учусь (и читать в том числе).
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    как бы не обязательно ошибка в строке без которой работает. Она может влиять на исход других апи.
    Проверил у себя твой код. Никаких исключений не генерится.