Сбой wxWidgets при закрытии приложения - PullRequest
0 голосов
/ 02 сентября 2011

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

КогдаЯ закрываю программное обеспечение, которое я получил SIGSEVerror со следующим сообщением:

#0 00000000 0x003f01c5 in ??() (??:??)
#1 004D36BC wxSocketClient::~wxSocketClient(this=0x2a8bf80, __in_chrg=<value optimized out>) (../../src/common/socket.cpp:1237)
#2 0042E9EE aaa::~aaa(this=0x2a5998c, __in_chrg=<value optimized out>) (C:\Documents and Settings\\My Documents\programming\assistant\Assistant\src\pasan.cpp:71)
#3 00416A49 AssistantFrame::~AssistantFrame(this=0x2a592c8, __in_chrg=<value optimized out>) (C:\Documents and Settings\\My Documents\programming\assistant\Assistant\AssistantMain.cpp:937)
#4 00416FCB AssistantFrame::~AssistantFrame(this=0x2a592c8, __in_chrg=<value optimized out>) (C:\Documents and Settings\\My Documents\programming\assistant\Assistant\AssistantMain.cpp:1007)
#5 00438F21 wxAppBase::DeletePendingObjects(this=0x2a59a58) (../../src/common/appcmn.cpp:423)
#6 00439067 wxAppBase::ProcessIdle(this=0x2a59a58) (../../src/common/appcmn.cpp:454)
#7 004DD68B wxEventLoopManual::Run(this=0x2ac4fb0) (../../src/common/evtloopcmn.cpp:99)
#8 00438C62 wxAppBase::MainLoop(this=0x2a59a58) (../../src/common/appcmn.cpp:312)
#9 00438D95 wxAppBase::OnRun(this=0x2a59a58) (../../src/common/appcmn.cpp:367)
#10 004E8372    wxEntryReal(argc=@0x22fe5c, argv=0x3f2880) (../../src/common/init.cpp:448)
#11 004330C0    wxEntry(argc=@0x22fe5c, argv=0x3f2880) (../../src/msw/main.cpp:231)
#12 004332AF    wxEntry(hInstance=0x400000, nCmdShow=10) (../../src/msw/main.cpp:386)
#13 00401441    WinMain(hInstance=0x400000, hPrevInstance=0x0, lpCmdLine=0x251f49 "", nCmdShow=10) (C:\Documents and Settings\\My Documents\programming\assistant\Assistant\AssistantApp.cpp:17)
#14 00000000    0x005f9566 in main() (??:??)

Проблема заключается в том, что мой код уже содержит 5 тыс. Строк и использует много элементов управления.Это какая-то полезная информация, потому что я не специалист по отладке?

Спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 02 сентября 2011

В целом:

  • Выполнить отладочную сборку

  • Запустить приложение

  • Вы можете получить дополнительные окна с дополнительной информацией о хитром коде. Если это так, отследите проблемы, замеченные отладочной сборкой, и исправьте их

  • Устраняет ли это проблему?

  • Если нет, запустите приложение под отладчиком. Когда происходит сбой, посмотрите на стек вызовов. Пройдите снизу вверх, пока не введете узнаваемый код. Это скажет вам, какой код выполнялся, когда произошел сбой. Это может быть деструктор для одного из ваших классов, который даст вам четкое представление о том, что нужно исправить.

В данном конкретном случае:

Кажется, сбой происходит в деструкторе wxSocketClient, вызванном из ../../src/common/socket.cpp:1237 Вы смотрели на это? Вы делаете здесь двойное удаление экземпляра wxSocketClient?

0 голосов
/ 02 сентября 2011

Чтобы найти начальную точку для отладки, нужно посмотреть на этот дамп. Третья строка состояния

#2 0042E9EE aaa::~aaa(this=0x2a5998c, __in_chrg=<value optimized out>) \
 (C:\Documents and Settings\My Documents\programming\assistant\Assistant\src\pasan.cpp:71)

Теперь, чтобы начать отладку, посмотрите на My Documents\programming\assistant\Assistant\src\pasan.cpp, строка 71.

0 голосов
/ 02 сентября 2011

Я думаю, что здесь сложно дать ответ, не заглядывая в исходный код. Не могли бы вы уменьшить сложность своего кода, временно отключив / закомментировав / не создавая экземпляры некоторых классов / окон? Как насчет того, чтобы начать с wxApp, только вызывая простой wxFrame и проверив, работает ли он без проблем ... затем переходите к пошаговому включению классов.

Udo

...