C++ assert

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 13 май 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Пара вопросов про assert из инклюдника <assert.h>



    1. Если окошко консольное, то на консоль выводится полный путь исходника и номер строки, где свалился ассерт. Если дебаговый билд конечно же. Можно ли простым способом перенаправить этот вывод в свой буфер? Хотелось бы без изврата типа пайпов.



    2. И самое интересное, как этот ассерт узнает где он находится? Имеется ввиду имя файла и строка. Ясно, что он эту инфу берет из дебаг-exe-шника. Вот только как именно? Есть ли для этого какое-нибудь удобное апи?
     
  2. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    1. Либо при запуске написать myprog 2>debug.txt, либо запустить процесс CreateProcess'ом установив ему stderr на какой-нить файл, либо поправить сам макрос assert чтобы он сразу в файл сообщения гнал.

    2. Он ни откуда не узнаёт, потому что уже всё знает. Когда в программе появляется ASSERT(x) в программу включается имя исходного файла и номер строки (сишниыми макросами __FILE__ и __LINE__) и всё. См. собственно текст макроса ASSERT. Если теперь этот ASSERT сработает - у него под рукой вся информация. А вообще api есть (см. в сторону DbgHelp в MSDN), но у каждого компилера оно специфическое, то что работает в MSVC, не работает в gcc/borland/и пр. С помощью этого api при наличии map-файла или pdb-файла можно по адресу (eip) смело определить имя файла и номер строки. Я так делал когда писал "красивый" обработчик exception'ов, чтобы сразу знать в каком месте накрылось (к exe'шнику был пристыкован в качестве оверлея упакованный map-файл)...
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nothing
    Код (Text):
    1. void main()
    2. {
    3.   char temp[64];
    4.   sprintf(temp,"%s, %d",__FILE__, __LINE__);
    5.   MessageBox(0,temp,0,0);
    6. }


    Да, все работает! :))) Круто!!)))



    Спасибо, Nothing
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Nothing



    И еще один вопрос. А можно ли не только файл + строку вытащить, но и еще весь call stack? Было бы просто офигительно...



    EDIT: орфография :)
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Без специальных средств - нет. Но в boost было что-то для этого.