eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Adler, user99 (+5 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Программа работает только под дебаггером
Посл.ответ Сообщение

Ранг: 1.8 (гость)
Статус: Участник

Создано: 3 мая 2014 18:14 New!
Цитата · Личное сообщение · #1

Добрый день. Решил обратиться сюда, ибо где, если не на креклабе, знают все о дебаггере.
Прога написана на чистом С с использованием генератора парсеров gnu bison и скомпилена gcc в debug конфигурации. Однопоточная. Она распарсивает java исходники, впрочем, это неважно.

Проблема в том что если запускать обычным способом, то прога либо вылетает, либо зависает. Но если запустить через gdb или через ollydbg то она успешно отрабатывает и показывает результат.

Как понять в каком месте она вылетает, если под отладкой все хорошо?

{ Атач доступен только для участников форума } - Debug.zip


Ранг: 1986.5 (!!!!)
Статус: Модератор
retired

Создано: 3 мая 2014 19:18 New!
Цитата · Личное сообщение · #2

Ставить отладчик JIT и цепляться при падении? Аттачить при зависании?

Ранг: 9.4 (гость)
Статус: Участник

Создано: 3 мая 2014 19:37 · Поправил: 4d1m New!
Цитата · Личное сообщение · #3

Запускаю без отладчика выдает сообщение и содает файл debug.txt
Code:
  1. {
  2.   "Package":"TestUnit.t.e.s.t",
  3.   "Imports":[
  4.     "java.awt.*",
  5.     "java.awt.event.*"
  6.   ],
  7.   "Classes":[
  8.     {
  9.       "Name":"ConsoleApplet",
  10.       "Type":"Class",
  11.       "Extends":[
  12.         "java.applet.Applet"
  13.       ],
  14.       "Interfaces":[
  15.         "Runnable",
  16.         "ActionListener"
  17.       ]
  18.     }
  19.   ]
  20. }

Ранг: 1.8 (гость)
Статус: Участник

Создано: 3 мая 2014 20:09 · Поправил: Desynx New!
Цитата · Личное сообщение · #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(). Убрал и все заработало. Сегодня таким способом ошибку обнаружить не удалось.


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 3 мая 2014 21:03 New!
Цитата · Личное сообщение · #5

Desynx

> исключение по адресу 0x7734E381

Эти цифры смысла не несут. Ставьте символы и сморите где проблема.


Статус: Пришелец

Создано: 3 мая 2014 21:17 New!
Цитата #6

С 95% уверенностью вангую расстрел памяти, если исходники не являются секретными разработками ЗОГ, то таки не мешало бы их положить в атач.

| Сообщение посчитали полезным: gazlan



Ранг: 169.6 (ветеран)
Статус: Участник

Создано: 3 мая 2014 23:20 New!
Цитата · Личное сообщение · #7

Прогнал, наспех.

{ Атач доступен только для участников форума } - junk.7z

| Сообщение посчитали полезным: Desynx



Ранг: 210.5 (наставник)
Статус: Участник
X-Literator

Создано: 7 мая 2014 17:18 New!
Цитата · Личное сообщение · #8

рекомендую автору поставить vmware+windbg+(по желанию) virtualkd.

После этого приаттачиться к процессу по следующей схеме:

!process 0 0
.process /r /p ИДЕНТИФИКАТОР_НУЖНОГО_ПРОЦЕССА

и дальше - если нужно - ставить точки останова на функции или адреса приблизительно вот так:
bp АДРЕС_ТОЧКИ_ОСТАНОВА

или так:

ba e 1 АДРЕС_ТОЧКИ_ОСТАНОВА

автор имеет возможность так отлаживать даже ядро, не то что какие-нибудь ринг3-проги. Всё под контролем, как говорится.

Подсказка - прога, скорее всего, зависнет (т.к., по идее, отладчика как бы и нет), и вы узнаете, в чем трабла.

Не благодарите)

| Сообщение посчитали полезным: Desynx


Ранг: 1.8 (гость)
Статус: Участник

Создано: 9 мая 2014 19:41 · Поправил: Desynx New!
Цитата · Личное сообщение · #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 мб. Это нормально?


Ранг: 324.2 (мудрец)
Статус: Участник

Создано: 9 мая 2014 20:45 New!
Цитата · Личное сообщение · #10

Desynx
Затирается у тебя где-то память в пуле, вот и падает на malloc'ах и free.

| Сообщение посчитали полезным: Desynx



Ранг: 1010.0 (!!!!)
Статус: Участник

Создано: 9 мая 2014 20:50 New!
Цитата · Личное сообщение · #11

соурсы этой лабы есть? нет?
смысл тогда обсуждать от чего она там падает, если она изначально криво написана и не отлажена

| Сообщение посчитали полезным: sivorog, gazlan


Ранг: 1.8 (гость)
Статус: Участник

Создано: 12 мая 2014 18:15 · Поправил: Desynx New!
Цитата · Личное сообщение · #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".


Ранг: 1010.0 (!!!!)
Статус: Участник

Создано: 12 мая 2014 18:22 New!
Цитата · Личное сообщение · #13

ну проморгал, там было столько текста что не заметил слова исходники

как то у вас все слишком сложно
банальный valgrind всегда спасал от таких проблем

Ранг: 1.8 (гость)
Статус: Участник

Создано: 12 мая 2014 20:27 New!
Цитата · Личное сообщение · #14

reversecode, ну Вы чего, valgrind'a же нет под винду.
Не знаю как Вы, но я считаю "запустить прогу из консоли с тремя командами по образцу из примера" тривиальной операцией.


Ранг: 72.3 (постоянный)
Статус: Участник

Создано: 12 мая 2014 21:19 New!
Цитата · Личное сообщение · #15

Desynx

Ну и где инфа про фолт, колстек ?

Есчо неделю будите искать эту инфу

Кажется мне что коденг это не ваше занятие. Может стоит заняться чем нить более плодотворным ?

Ранг: 1.8 (гость)
Статус: Участник

Создано: 12 мая 2014 22:32 New!
Цитата · Личное сообщение · #16

Dr0p
Воу воу палехче, я занимался этим всего 3 вечера
Тот кто найдет этот тред, наверняка будет знать о "фолт" и "колстек", но если нет, мне все равно. Вижу в разделе для новичков не приветствуются подробные ответы.


Статус: Пришелец

Создано: 13 мая 2014 01:54 · Поправил: F_a_u_s_t New!
Цитата #17

Desynx пишет: reversecode, ну Вы чего, valgrind'a же нет под винду.

Ваша неправда --> Link <--

Ранг: 1.8 (гость)
Статус: Участник

Создано: 13 мая 2014 13:10 New!
Цитата · Личное сообщение · #18

F_a_u_s_t, каюсь, соврал. Но все же вряд ли reversecode, намекая на простой, "банальный valgrind", имел в виду эту еще только преальфу.
 eXeL@B —› Вопросы новичков —› Программа работает только под дебаггером

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS