Сейчас на форуме: (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Программа работает только под дебаггером |
Посл.ответ | Сообщение |
|
Создано: 03 мая 2014 18:14 · Личное сообщение · #1 Добрый день. Решил обратиться сюда, ибо где, если не на креклабе, знают все о дебаггере. Прога написана на чистом С с использованием генератора парсеров gnu bison и скомпилена gcc в debug конфигурации. Однопоточная. Она распарсивает java исходники, впрочем, это неважно. Проблема в том что если запускать обычным способом, то прога либо вылетает, либо зависает. Но если запустить через gdb или через ollydbg то она успешно отрабатывает и показывает результат. Как понять в каком месте она вылетает, если под отладкой все хорошо? ![]() ![]() |
|
Создано: 03 мая 2014 19:18 · Личное сообщение · #2 |
|
Создано: 03 мая 2014 19:37 · Поправил: 4d1m · Личное сообщение · #3 |
|
Создано: 03 мая 2014 20:09 · Поправил: Desynx · Личное сообщение · #4 Аттачиться при зависании ничего не дало. Он останавливается где то в ntdll перед RtlExitUserThread. JIT отладчик от 12 студии говорит: "Необработанное исключение по адресу 0x7734E381 (ntdll.dll) в cb_java.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0066F85F" 7734E381 mov byte ptr [ecx+7],al Под ollydbg прога по адресу 0x7734E381 даже не останавливается, а памяти с адресом 0x0066F85F просто нет. Соответственно поставить хардварный бряк на 0x0066F85F нельзя. Насколько я знаю, gdb умеет показывать строку в коде с которой крашиться. Но под ним все прекрасно работает. Я понимаю что проблема в где-то непроинициализированной памяти. В gdb можно запускать на отладку так, чтобы он ничего не менял в памяти? Желательно научиться понимать с какой строки в исходниках все падает. 4d1m пишет: Запускаю без отладчика выдает сообщение и создает файл debug.txt По идее так она и должна работать. Но вот у меня валится. Кстати, это не первый такой случай. Вчера эта же прога тоже работала только под отладкой, эмпирическим способом выяснил что это происходит из за free(). Убрал и все заработало. Сегодня таким способом ошибку обнаружить не удалось. ![]() |
|
Создано: 03 мая 2014 21:03 · Личное сообщение · #5 |
|
Создано: 03 мая 2014 21:17 · Личное сообщение · #6 С 95% уверенностью вангую расстрел памяти, если исходники не являются секретными разработками ЗОГ, то таки не мешало бы их положить в атач. ![]() |
|
Создано: 03 мая 2014 23:20 · Личное сообщение · #7 |
|
Создано: 07 мая 2014 17:18 · Личное сообщение · #8 рекомендую автору поставить vmware+windbg+(по желанию) virtualkd. После этого приаттачиться к процессу по следующей схеме: !process 0 0 .process /r /p ИДЕНТИФИКАТОР_НУЖНОГО_ПРОЦЕССА и дальше - если нужно - ставить точки останова на функции или адреса приблизительно вот так: bp АДРЕС_ТОЧКИ_ОСТАНОВА или так: ba e 1 АДРЕС_ТОЧКИ_ОСТАНОВА автор имеет возможность так отлаживать даже ядро, не то что какие-нибудь ринг3-проги. Всё под контролем, как говорится. Подсказка - прога, скорее всего, зависнет (т.к., по идее, отладчика как бы и нет), и вы узнаете, в чем трабла. Не благодарите) ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. ![]() |
|
Создано: 09 мая 2014 19:41 · Поправил: Desynx · Личное сообщение · #9 Сегодня наконец нашлось время заняться этим. gazlan, не очень понятно что за адреса на скринах, но по видимому это смещения в файле. Crawler, это очень здорово, но, на мой взгляд, как из пушки по воробьям =) Обнаружить строчку на которой все падает удалось. Совершенно тупым образом: добавил в проге getchar(); потом запустил, прицепился gdb, продолжил дальше и она вывалилась SEGFAULT'ом на одной из malloc в strdup(), что очень хорошо коррелирует с результатом BoundChecker'а от gazlan. F_a_u_s_t, код выложить не проблема, http://rghost.ru/55053347, если у кого то есть codeblocks и MinGW, то все сразу должно скомпилиться. Как только я подобавлял free() в нужных местах, падать стало на них. В общем, при том что стало ясно где что падает, мне так и не удается это исправить. Теперь вопросы: 1. Иногда gdb останавливается на тех местах где нет бряков, а именно на free(), причем продолжить выполнение потом можно, может кто знает почему он там останавливается? 2. Я не понимаю, если прога валится на malloc, calloc, то значит она не может выделить память, значит происходит memory overrun, но при этом она потребляем всего 3.5 мб. Это нормально? ![]() |
|
Создано: 09 мая 2014 20:45 · Личное сообщение · #10 Desynx Затирается у тебя где-то память в пуле, вот и падает на malloc'ах и free. ----- Everything is relative... ![]() |
|
Создано: 09 мая 2014 20:50 · Личное сообщение · #11 |
|
Создано: 12 мая 2014 18:15 · Поправил: Desynx · Личное сообщение · #12 reversecode, ну Вы чего, я выложил исходники предыдущим постом. Но сейчас в них уже нет необходимости. Всем спасибо. Ошибки нашел. Все как сказал Vamit, виновником был strcat. Основная проблема (лично для меня) заключалась в том, что весь материал по этой теме англоязычный. Пришел отписаться о том как на самом деле их надо было ловить, в надежде на то, что кому-то это пригодится. По пунктам: 1. Осознать как устроен The Heap, а именно про наличие в нем заголовков. Понимание этого, неожиданно, я достиг тут: http://www.xakep.ru/magazine/xa/081/074/1.asp 2. Скачать и поставить утилиту GFlags, которая позволяет включить возможность включить наблюдение за использованием памяти в куче. Опция называется PageHeap. Пример ее использования хорошо описан тут: http://msdn.microsoft.com/en-us/library/windows/hardware/ff543097(v=vs.85).aspx 3. Обязательно нужно включить опцию с параметром full. Иначе она так же будет падать только на malloc/free. 4. С включенной опцией прога валится вне зависимости от условий ровно на причине этого. Остается лишь запустить ее под удобным дебаггером и посмотреть Call Stack. Кому надо больше, гуглить "Heap Corruption". ![]() |
|
Создано: 12 мая 2014 18:22 · Личное сообщение · #13 |
|
Создано: 12 мая 2014 20:27 · Личное сообщение · #14 |
|
Создано: 12 мая 2014 21:19 · Личное сообщение · #15 |
|
Создано: 12 мая 2014 22:32 · Личное сообщение · #16 |
|
Создано: 13 мая 2014 01:54 · Поправил: F_a_u_s_t · Личное сообщение · #17 |
|
Создано: 13 мая 2014 13:10 · Личное сообщение · #18 |
![]() |
eXeL@B —› Вопросы новичков —› Программа работает только под дебаггером |