Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > "UnhandledException at ..." - как узнать место


Автор: malor 19.7.2011, 21:32
user posted image
По CallStack'у уходящему длинной вереницей серых строк вниз не ясно на каком месте кода возникло. Как вычислить расположение?

Автор: asmdzen 19.7.2011, 22:08
не исключено что здесь просто испорчен стек и ничего полезного узнать не удастся.

Автор: xvr 20.7.2011, 20:13
Похоже ваш SnapShotSrv.exe был собран без отладочной информации. Проверьте, вы Debug конфигурацию запускаете?

Автор: Estranged 20.7.2011, 22:15
как узнать место, возникновения ошибки - даже адрес где упало написан: 0x30303131. Подключаем Windbg и смотрим. Или собрать модуль с отладочной информацией, тогда еще удобнее будет смотреть.

Автор: bsa 21.7.2011, 19:39
Estranged, тебе адрес подозрительным не кажется? по мне так смахивает на текст "1100".

Автор: Estranged 21.7.2011, 23:38
bsa, еще какой подозрительный. Смотреть по стеку вызовов, откуда пришли, кто сделал передачу управления по такому адресу. Отладчик VS не умеет показывать имена функций, т.к. не имеет правильной pdb, а правильно настроенный Windbg сам скачает нужную pdb для ntdll и всех задействованных dll, что, как я уже писал, существенно облегчит диагностику.

Автор: xvr 22.7.2011, 10:40
Судя по стеку вызовов в какую то WinAPI функцию в качестве callback'а вместо адреса процедуры передали строку

Автор: malor 28.7.2011, 20:11
Вот этот код закомментил и перестало падать:
Код

int keyCode;                // Код нажатого символа
int down;
...................
[Присвоение значений переменным keyCode и down]
...................

char strKeyCode[10];
char strDown[2];
_itoa(keyCode, strKeyCode, 10);
_itoa(down, strDown, 2);
strcat(strKeyCode, " ");
strcat(strKeyCode, strDown);
SaveLog(strKeyCode);

Что в нем неправильно? Какой-нибудь выход за границы?

Собственно функция логгирования:
Код

bool SaveLog(char *strMesg)
{
    int result;

    time_t t = time(NULL);
    struct tm * tm = localtime(&t);
    strMesg = strcat(asctime(tm), strMesg);
    strMesg = strcat(strMesg, "\n");
    
    result = fputs(strMesg, pFileLog);
    fflush(pFileLog);

    if (result == EOF)
    {
        return false;
    }
    
    return true;
}

Автор: Dem_max 28.7.2011, 20:15
может не жопиться ? и сделать так
Код

char strKeyCode[100];
char strDown[100];

Автор: Estranged 28.7.2011, 22:03
Переполнение буфера на 99%.
_itoa(keyCode, strKeyCode, 10); - пусть 1 символ + нуль-терминатор
_itoa(down, strDown, 2);
strcat(strKeyCode, " "); - +1 символ
strcat(strKeyCode, strDown); - пусть еще +1
strMesg = strcat(asctime™, strMesg); - ?
strMesg = strcat(strMesg, "\n"); +1

Итого уже заняты 5 символов, asctime возвращает строку значительно длиннее 5 символов, в итоге стек подпорчен. 

Автор: bsa 29.7.2011, 10:56
malor, Estranged, быстро бежать и смотреть описание _itoa(). Ошибку найдете сразу же!!!

Автор: Estranged 29.7.2011, 20:15
bsa, и что же там такого написано, что было упущено?

Автор: Dem_max 29.7.2011, 21:05
да и что же там не то, я тоже не в курсе

Автор: asmdzen 29.7.2011, 21:11
Estranged, Dem_max, последний параметр не ограничение по символам а основание системы счисления (base), там по любому будет переполнение буфера
http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

Автор: Dem_max 29.7.2011, 21:17
ну и так понятно, что это код системы счисления, но как раз в этом месте ошибки нету.

Автор: asmdzen 29.7.2011, 22:25
Цитата(Dem_max @  29.7.2011,  21:17 Найти цитируемый пост)
как раз в этом месте ошибки нету

а могла бы быть ))

Автор: volatile 30.7.2011, 00:34
Цитата(malor @  28.7.2011,  20:11 Найти цитируемый пост)
    strMesg = strcat(asctime™, strMesg);
    strMesg = strcat(strMesg, "\n");


Здесь походу пишем в системную статическую память.
Читать про asctime();

Туда писать вообще нельзя, кроме того там буфер не безразмерный.
Что там затираете, одному богу известно...



Автор: Dem_max 30.7.2011, 08:34
Цитата

Туда писать вообще нельзя


походу ТС адский программер, в небольшом участке кода столько ошибок, мама дорогая.

Автор: bsa 1.8.2011, 09:54
Цитата(Dem_max @  29.7.2011,  21:17 Найти цитируемый пост)
ну и так понятно, что это код системы счисления, но как раз в этом месте ошибки нету. 

Да ладно? По-моему второй параметр используется именно как размер буфера, а не основание системы счисления, коим он должен быть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)