New user registration is currently disabled due to spam abuse / Регистрация новых пользователей в настоящее время приостановлена из-за злоупотреблений спаммерами

Runtime Error

Сообщаем о найденных ошибках сюда

Re: Runtime Error

Postby ikm » Tue Jun 01, 2010 7:36 pm

А если перестроить индексы? А перед этим сбэкапить старые, и потом сравнить то, что было, и то, что стало?
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

Re: Runtime Error

Postby Gloggy » Tue Jun 01, 2010 8:48 pm

ikm wrote:А если перестроить индексы? А перед этим сбэкапить старые, и потом сравнить то, что было, и то, что стало?

Индексы совпадают до байта. Так же попробовал собрать с Qt 4.7.0-beta1, все то же самое. Пробовал OllyDbg'ом в асме порыться, тот тоже что-то не очень ловит где там проблема. Просто все нитки вылетают с exit status'ом 3, а почему - обоим дебаггерам не ведомо.
Gloggy
Модератор
 
Posts: 516
Joined: Wed May 06, 2009 3:01 pm

Re: Runtime Error

Postby ikm » Tue Jun 01, 2010 9:14 pm

Основной вопрос - именно в том, в каком месте падает. abort() программа не вызывает (за искл. кода dictzip, однако он перед падением пишет в консоль), termination handler программа использует свой собственный. Если бы как-то получить backtrace...
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

Re: Runtime Error

Postby ikm » Tue Jun 01, 2010 9:22 pm

В интернетах предлагают подключиться дебаггером к процессу, когда он уже показывает данное сообщение, дабы получить бэктрейс.
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

Re: Runtime Error

Postby Gloggy » Wed Jun 02, 2010 1:59 pm

ikm wrote:В интернетах предлагают подключиться дебаггером к процессу, когда он уже показывает данное сообщение, дабы получить бэктрейс.

И так тоже пробовал. И из-под GDB пробовал. Ни-че-го. Поразительно просто. Вот уже 15 лет как программист, правда не на C/C++, но вот такие вот вещи в 21-м веке они просто удивительны. Ну казалось бы, блин! Всего-то стэктрейс получить!!! ;) В Java/Ruby/C# я бы это сделал бы тривиально. Точнее, даже ничего и делат не надо было бы, оно само бы все напечаталось. А тут два дня плясок с бубном - и как об стену горох!!! :)

Собираюсь применять атомный вариант - поставить Visual Studio и попытаться собрать GD при помощи Visual Studio. Такое у меня нехорошее подозрение, что вот эти все грабли с падениями - они не в GD самом, а в mingw, перемудрили они там что-то с эксепшнами.
Gloggy
Модератор
 
Posts: 516
Joined: Wed May 06, 2009 3:01 pm

Re: Runtime Error

Postby ikm » Wed Jun 02, 2010 3:45 pm

Можно попробовать использовать собственный обработчик SIGABRT, установив его с помощью функции signal. По ссылке есть пример как раз про abort(). Внутри обработчика можно вставить что-то типа "int 3" для вызова дебаггера.
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

Re: Runtime Error

Postby ikm » Wed Jun 02, 2010 3:56 pm

Во, придумал полностью готовое решение. Ставим обработчик SIGABRT как из примера, а в нём делаем так, чтобы программа упала:
Code: Select all
void SignalHandler(int signal)
{
  *(char *)0 = 0;
}

Дальше берем Dr. Mingw, делаем drmingw.exe -i для его инсталляции, потом запускаем сам GD, он падает, выводит сначала про "Unusual way", потом виндовый диалог про падение программы - в нём нажимаем Debug, запускается dr. mingw и всё нам рассказывает.
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

Re: Runtime Error

Postby Gloggy » Wed Jun 02, 2010 4:19 pm

ikm wrote:Во, придумал полностью готовое решение.

Урррра! Зарработало! ;)

Из-под GDB вижу следующее:

Code: Select all
0x0041eb93 in SignalHandler (signal=22) at main.cc:27
27          *(char *)0 = 0;
(gdb) bt
#0  0x0041eb93 in SignalHandler (signal=22) at main.cc:27
#1  0x75085e87 in raise () from C:\Windows\syswow64\msvcrt.dll
#2  0x00000016 in ?? ()
#3  0x75088e8a in msvcrt!abort () from C:\Windows\syswow64\msvcrt.dll
#4  0x6e946245 in libgcc_s_dw2-1!_Unwind_FindEnclosingFunction () from D:\work\goldendict\debug\libgcc_s_dw2-1.dll
#5  0x6e9466ec in libgcc_s_dw2-1!_Unwind_RaiseException () from D:\work\goldendict\debug\libgcc_s_dw2-1.dll
#6  0x00589036 in __cxa_throw (obj=0x19039640, tinfo=0x626808, dest=0)
    at ../../../../gcc-4.4.0/libstdc++-v3/libsupc++/eh_throw.cc:78
#7  0x00472bd6 in Dsl::Details::ArticleDom::nextChar (this=0x1b6ffdc0) at dsl_details.cc:463
#8  0x00471569 in ArticleDom (this=0x1b6ffdc0, str=@0x1b6ffdec) at dsl_details.cc:71
#9  0x00468495 in dslToHtml (this=0x15c54600, str=@0x1b6ffe58) at dsl.cc:670
#10 0x0046c97b in run (this=0x1916c490) at dsl.cc:1048
#11 0x0046c64e in run (this=0x190c53d8) at dsl.cc:983
#12 0x6a10ca34 in QThreadPoolThread::run (this=0x1913b828) at concurrent\qthreadpool.cpp:106
#13 0x6a115761 in QThreadPrivate::start (arg=0x1913b828) at thread\qthread_win.cpp:315
#14 0x75031287 in msvcrt!_itow_s () from C:\Windows\syswow64\msvcrt.dll
#15 0x75031328 in msvcrt!_endthreadex () from C:\Windows\syswow64\msvcrt.dll
#16 0x76b83677 in KERNEL32!BasepMapModuleHandle () from C:\Windows\syswow64\kernel32.dll
#17 0x1913bb08 in ?? ()
#18 0x1b6fffd4 in ?? ()
#19 0x77489d72 in ntdll!RtlpNtMakeTemporaryKey () from C:\Windows\system32\ntdll.dll
#20 0x1913bb08 in ?? ()
#21 0x6c66c02f in ?? ()
#22 0x00000000 in ?? ()


А при промощи Dr. Mingw чуть другой результат (номер строки)

Code: Select all
goldendict.exe caused an Access Violation at location 0041eb93 in module goldendict.exe Writing to location 00000000.

Registers:
eax=00000000 ebx=00000016 ecx=75098e62 edx=00000000 esi=750c3180 edi=00000000
eip=0041eb93 esp=1a97f5ac ebp=1a97f5c4 iopl=0         nv up ei pl zr na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246

Call stack:
0041EB93  goldendict.exe:0041EB93  SignalHandler  main.cc:27

   ...
   {
       printf("Application aborting...\n");
>       *(char *)0 = 0;
   }
   
   ...

75085E87  msvcrt.dll:75085E87  raise
75088E8A  msvcrt.dll:75088E8A  abort
6E946245  libgcc_s_dw2-1.dll:6E946245  _Unwind_FindEnclosingFunction
6E9466EC  libgcc_s_dw2-1.dll:6E9466EC  _Unwind_RaiseException
00589036  goldendict.exe:00589036
00472BD6  goldendict.exe:00472BD6
00471569  goldendict.exe:00471569  ArticleDom  dsl_details.cc:73

   ...
         nextChar();
   
>         if ( ch == L'[' && !escaped )
         {
           // Beginning of a tag.
   ...

00468495  goldendict.exe:00468495
0046C97B  goldendict.exe:0046C97B
0046C64E  goldendict.exe:0046C64E
6A10CA34  QtCored4.dll:6A10CA34  _ZNK12QtConcurrent8internal14ExceptionStore9hasThrownEv
6A115761  QtCored4.dll:6A115761  _ZN18QThreadStorageData6finishEPPv
75031287  msvcrt.dll:75031287  _itow_s
75031328  msvcrt.dll:75031328  _endthreadex
76B83677  kernel32.dll:76B83677  BaseThreadInitThunk
77489D72  ntdll.dll:77489D72  RtlInitializeExceptionChain
77489D45  ntdll.dll:77489D45  RtlInitializeExceptionChain
Gloggy
Модератор
 
Posts: 516
Joined: Wed May 06, 2009 3:01 pm

Re: Runtime Error

Postby ikm » Wed Jun 02, 2010 5:22 pm

Сижу разбираюсь. Попробуй пока вставить после создания qapplication:

QThreadPool::globalInstance()->setMaxThreadCount( 1 )

будет ли продолжать падать?
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

Re: Runtime Error

Postby ikm » Wed Jun 02, 2010 6:30 pm

Вот еще одна смешная вещь на попробовать, вставить тоже после qapplication:
Code: Select all

class Foo {};

try
{
  throw Foo();
}
catch( Foo )
{
}

Такое ощущение, что возникает проблема первичной инициализации какой-то глобальной переменной, которую пытаются инициализировать несколько тредов одновременно при попытке выкинуть исключение. Если мы проведем эту первичную инициализацию заранее, выкинув один раз исключение до того коварного переломного момента в будущем, проблемы нарушения пространственно-временного континуума быть не должно.
ikm
Автор GoldenDict
 
Posts: 1595
Joined: Wed Feb 04, 2009 10:40 am

PreviousNext

Return to Ошибки

Who is online

Users browsing this forum: No registered users and 1 guest