powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
25 сообщений из 36, страница 1 из 2
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413251
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прога основана на Opal.
Скомпилирована в VC++ 2005 EE.
Если делать большую нагрузку (напр. 50 одновременных телефонных вызовов),
то в какой-то момент может вылететь:
proga.exe обнаружена ошибка. Приложение будет закрыто
Кнопки : отладка, отправить отчет, не отправлять.

Что интересно, если это краш-окно не трогать, то будет работать дальше, ущерба для функционала не заметил.

Если нажать <отладка> то запускается VC++ 6.0 (у меня отладчик на него стоит).
Сообщение: Unhandled exception in proga.exe: 0xC0000005. Access Violation.
И картинка которую приложил - всегда одна и та же и числа (адреса? чего?) одни и те же.
И чего делать дальше, как искать ошибку в коде глядя на ето?

Я как баран на новые ворота на это смотрю.
Один раз была в Opal одна ошибка. Developer попросил картинку (типа что я приложил) и глядя на нее исправил (о чудо) ошибку.

Я пытался лечить затычками, ограничивая нагрузку в зависимости от пиков CPU Usage:
Как получить загрузку CPU в % программно?

Это все чуть помогает, но слабенько. Ошибка все одно вылазит.

Пытался увеличить время ожидания завершения отдельных потоков внутри приложения по совету одного из авторов кода:
thread->WaitForTermination(10000) -> thread->WaitForTermination(100000)
Но это боюсь вообще не то.

Коды то есть, но там черт не разберется.
Дебаг проги (Opal-овский) включить конечно можно, но на 50 вызовов через 5 минут там будут гигабайты, + этот дебаг еще создаст свою нагрузку и задержки.

Т.е. вопрос. Я получил картинку "Отладка", что и как мне делать дальше?
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413274
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Что интересно, если это краш-окно не трогать, то будет работать дальше,
ущерба для функционала не заметил.
Это неинтересно, поскольку значит всего лишь, что упал с AV и аварийно завершился один из
рабочих потоков, остальные продолжают как-то работать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413278
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
Нет. Данная ошибка скорее всего вообще к делу не относится.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413337
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭто неинтересно, поскольку значит всего лишь, что упал с AV и аварийно завершился один из
рабочих потоков, остальные продолжают как-то работать. Ну, допустим плевать я хотел (как вариант) на это аварийное завершение.
Только как сделать чтоб окно не выводилось и прога дальше работала?


Сразу скажу, что речь идет не о моих самодельных потоках,
которые недавно обсуждали:
Как передать строковый параметр в CreateThread?
Те я их полностью убрал (неэффективно и чревато). Сохраняю String(WM_COPYDATA) в глобальной переменной и обрабатываю String в таймере. String всегда единственный, если не пустой то таймер его обрабатывает. Но это вообще к тек. вопросу не относится. Просто уточнил, т.к. ты ту тему читал.

Если это потоки, то это "родные опаловские", их там черт знает сколько создается.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413341
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Сохраняю String(WM_COPYDATA) в глобальной переменной
Стесняюсь спросить: а мьютекс вы используете при записи и чтении этой переменной потоками?
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413386
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Я ж сказал, что ТЕ (свои) бесполезные потоки я убрал и это к тек. вопросу отношения не имеет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
PString New_Job ="";
HWND h_Job = 0;

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{
  switch( message )
  {
    case WM_COPYDATA:
      COPYDATASTRUCT* pcds;
      pcds = (COPYDATASTRUCT*)lparam;
      } else if (pcds->dwData == 71) {//new job
          h_Job = (HWND)wparam;
          New_Job = PString((LPCTSTR)(pcds->lpData));
          return 1;
...
    case WM_TIMER:
      if (New_Job.GetLength() > 0) {
...
          PString f = New_Job;
...
          'код запуска задания
...
          SendMessage(h_Job, WM_COPYDATA, 0, (LPARAM) &cds); 'сообщение что задание запущено(и можно повторять процесс)

          New_Job = "";
          h_Job = 0;
        }
      }



От этого кода я отказался .

Еще раз, это не имеет отношения к текущему вопросу.

Крашит OPAL-овкая внутренность.
При ОЧЕНЬ большой нагрузке (например 30 или 50 одновременных вызовов, а не 5 или 10).
Причем там не просто РАЗГОВОР ПО ТЕЛЕФОНУ, там ФАКСЫ (SpanDSP - T.38 либо G.711 одновременно по всем 50 каналам)- чтоб было понятно про нагрузку.

Хотя нагрузки там особой похоже и нет (я поставил ограничитель как смог ), ну 20% CPU, ну импульсы до 40%, а все равно крашит.

При генерации указанной краш-ошибки ни одна из линий не вылетает и моя SendMessage конструкция (кусок кода которой я привел) тоже остается работоспособной, т.е. я бы просто эту ошибку ЗАБИЛ (если она критична, то оно потом вылезет, но не факт что реально критична), но знать бы как и куда копать .
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413409
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Крашит OPAL-овкая внутренность.
При ОЧЕНЬ большой нагрузке (например 30 или 50 одновременных вызовов, а не 5 или 10).
Это либо баг в самом опале, либо в том, как ты его используешь. В любом случае тебе надо
жаловаться автору опала чтобы либо исправил своего бага, либо поставил защиту от идиотов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413426
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

Причем прога же сначала компилируется в Release (а в Debug оно кажется и не компилируется вообще), а потом запускается exe. Он и крашит.
И знать бы где
cout <<
воткнуть (в километрах то кода)
Вариантов (как в VB6) запустить "Play" на проект а он воткнет в место ошибки в коде то нет.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413439
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77одно дело при единственном звонке сделать лог и послать автору.Другое дело
при куче звонков.
Нет, это одно и то же. При "куче звонков" просто вылазят баги в синхронизации потоков. Они
имеют свои особенности, но ловятся точно так же: анализом стэка. Скачиваются .pdb файлы от
библиотеки, настраивается DrWatson или аналогичная софтина на сброс дампа памяти, потом в
отладчике анализируется backtrace.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413470
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Твоя ошибка— защита памяти, обращение по несуществующие адресу, как забороть — очень сложно однозначно сказать, надо раскручивать логику и искать, где съезжает адрес. Это порой очень сложно, поскольку падать может совсем не,в том месте, где ошибка.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413542
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv как забороть — очень сложно однозначно сказать, ...
Я предложил вариант ЗАБИТЬ , т.е. проигнорировать, но вот как это сделать.

Dimitry Sibiryakov, либо в том, как ты его используешь...
Есть одно соображение. Раньше я использовал такую "технологию пуляния файлами":

Proga1(VB6) делает WriteFile -> Proga2(C++) делает ReadFile
и наоборот
Proga2(С++) делает WriteFile -> Proga1(VB6) делает ReadFile

Сейчас я заменил на новую "отработанную" технологию.

Proga1(VB6) делает SendMessage(CopyData) -> Proga2(C++) читает в WndProc
и наоборот
Proga2(С++) делает SendMessage(CopyData) -> Proga1(VB6) читает в WndProc

Но здесь есть один недостаток.
SendMessage не завершается пока не получит код возврата от того кому посылали.
В примере кода выше:
14908427
хорошо видно что в
case WM_COPYDATA
результат возвращается сразу (спас VB6 приложения от "ожидания"), а обработка
уже в WM_TIMER.
Но то SendMessage которое в WM_TIMER (обратка) уже будет ждать пока VB6 его обработает.
В данной ситуации это не страшно.

Но я так же практикую:

(Какой-то внутренний поток в C++) делает SendMessage(CopyData) -> Proga1(VB6) читает в WndProc
И не просто читает а ОБРАБАТЫВАЕТ, т.е. делает запись в БД, конвертирует файл из одного формата в другой и т.п.
И в варианте с SendMessage этот (Какой-то внутренний поток в C++) будет ждать пока VB6 это сообщение обработает
При увеличении нагрузки время обработки увеличивается, и это возможно м.б. критично.
(Какой-то внутренний поток в C++) м.б. Call_established, Call_released, Fax_Connected, Fax_Sent_OK.

Т.е. проблема с SendMessage в том, что я заставляю процесс ЖДАТЬ ТАМ ГДЕ ЭТО НЕ НУЖНО ПО ЛОГИКЕ

В случае с пулянием файлами поток просто скидывает файл на диск (это быстро), а VB6 пусть его обрабатывает хоть 2 часа.

Ну, если только вот это.

По идее нужно что-то другое вместо SendMessage, тут советовали.
13794617
13795624

но переделывать идеологию обмена, это не раз плюнуть.
И подозреваю (по ощущениям) что ошибка не связана с механизмом COPY_DATA.

Как вариант, воспроизвести тот же эксперимент с "пулянием файлами" на "старой версии" (ранее не делал).
и посмотреть будет ли вылазить эта же ошибка. (запись файла точно не вносит задержки в поток)
Но я боюсь что я не сумею воспроизвести ТАКУЮ ЖЕ интенсивность процессов,
ведь пуляние файлами очень инертно.

С пулянием файлами у меня 3 таймера по 1 сек (чтоб отослать задание и получить ответ).
А здесь у меня 300мс + 500мс + WndProc (как только так сразу).

А "3 таймера по 1 сек " по определению не позволят задействовать "мощности", меньше заданий в единицу времени стартуются.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413623
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. проблема с SendMessage в том, что я заставляю процесс ЖДАТЬ ТАМ ГДЕ ЭТО НЕ НУЖНО ПО ЛОГИКЕ

В случае с пулянием файлами поток просто скидывает файл на диск (это быстро), а VB6 пусть его обрабатывает хоть 2 часа.

Ну, если только вот это.

И подозреваю (по ощущениям) что ошибка не связана с механизмом COPY_DATA.

Как вариант, воспроизвести тот же эксперимент с "пулянием файлами" на "старой версии" (ранее не делал).
и посмотреть будет ли вылазить эта же ошибка. (запись файла точно не вносит задержки в поток)
Но я боюсь что я не сумею воспроизвести ТАКУЮ ЖЕ интенсивность процессов,
ведь пуляние файлами очень инертно.

Да не. Воспроизвел то же самое с "пулянием файлами".
Перенастроил 3 таймера по 100мс (2 в VB6 и один в C++ через {PThread::Sleep(100);...})
Куда уж меньше.

Приложение с объемами в 30-50 линий справляется, с "пулялкой" не путается, все ж продумывал когда-то.
т.е. та же интенсивность

А ошибка вылазит (та же самая!!! как на картинке - с теми же цифрами).
Если не закрывать crash-окно - работа продолжается.

Ну, хотя бы могу сказать что новосделанный "механизм COPY_DATA" тут не причем(хотя соображение про "время ожидания ответа на SendMessage" меня не очень греет).
Можно не грешить на это.

Ошибка где-то в недрах Opal.
Я в принципе согласен на "усыпить", только вот как?
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413715
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как сделать так
чтоб прога по команде
Start Debugger (в студии)
запускалась также как и exe:
Т.е. я поставил
Linker -> General
Output File C:\Program Files\Proga/proga.exe (вместо .\Release/proga.exe)
Компилируется теперь туда где работает.
Прога запускается, библиотеки видит.
Но чего-то "стандартного для себя чего ей обычно надо" не видит (как если бы из своей директории).
Такое ощущение что рабочая папка не та.

Что ей еще не хватает?

Хотя чесно не знаю что мне это даст
Binary was not built with debug information.
...

но попытаться то стоит..
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413751
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче кажется везет, дебаггер (2005) тыкает меня в единственное место кода причем в код самой dll (Opal).
Т.е. насколько я понимаю, кто-то (с опозданием) пытается закрыть вызов - перевести Connection в phaseToSet=ReleasedPhase,
а текущая phase уже пустая (вызов был прикрыт из другого места) и this* уже разрушено.

И как быть (ЗАБИТЬ)?
Надо наверно написать
If phase отсутствует -> на выход функции
Нет?
Есть идеи?
По хорошему посылать автору эту картинку с вопросом "как такое может быть"?
Искать кто вызывает ф-цию? Это можно намудрить...

Я думаю при включенном PTRACE оно б еще строчкой раньше вылетело,
ГЫ...но в логе было бы пусто.

Кстати, эти дебажьи картинки как-то в текст трансформируются?
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38413768
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
void OpalConnection::SetPhase(Phases phaseToSet)
{
  //cout << "\nOpalCon\tSetPhase from " << phase << " to " << phaseToSet << " for " << *this << "\n";
  //PTRACE(3, "OpalCon\tSetPhase from " << phase << " to " << phaseToSet << " for " << *this);

  try
  {
  PWaitAndSignal m(phaseMutex);
  }
  catch (int i){}

  // With next few lines we will prevent phase to ever go down when it
  // reaches ReleasingPhase - end result - once you call Release you never
  // go back.
  try
  {
  if (phase < ReleasingPhase || (phase == ReleasingPhase && phaseToSet == ReleasedPhase))
    phase = phaseToSet;
  }
  catch (int i){}
}



все равно вылетает и тыкает в строчку
Код: plaintext
1.
PWaitAndSignal m(phaseMutex);


-вроде ж это в блоке try . Всего лишь хочу сделать
Код: vbnet
1.
On Error resume Next
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414099
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я предложил вариант ЗАБИТЬ, т.е. проигнорировать, но вот как это сделать.

Тоже достаточно сложно, практически никак.
Идея в том, чтобы обрамить какие-то вызовы выше по стеку того места, где происходит ошибка, стеком SEH-исключений, и
исключение игнорировать (я бы логировал лучше).

Но для этого надо знать хотя бы, где это происходит и иметь этот код в своих руках, хотя бы тот, что его вызывает.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414677
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНо для этого надо знать хотя бы, где это происходит и иметь этот код в своих руках, хотя бы тот, что его вызывает.
Код то в руках.
Ты картинку выше видел (Debug 2005-й студии)?
Я уткнулся в место ошибки (в коде).
И я могу затупить ф-цию даже через try...catch (сделав например cout << value, где с value проблемы) -у меня это в итоге получилось вроде.
Только код в этом случае идет дальше своим путем, и путь этот неверный,
я тут же получаю ошибку в другом месте, причем не в Opal а уже в ptlib (более общие ф-ции), а там уже логику не отследишь вообще никак.
А в случае НЕ-нажатия кнопки в crash-окне как было подмечено(видимо верно) один из потоков просто вылетает. А поток этот скорее всего уже и не нужен (this=Connection, суть вылетающего кода как раз сделать ему Released), поэтому все и работает, если crash-окно не трогать. А если я "пропускаю", то "больной" поток продолжает куролесить. Как то так.

P.S. На автора надежды мало. Это старая версия Opal. Уже пытался, получил 2 письма, они вообще не по сути вопроса, он по ходу не врубился в описание проблемы. Надо как то самому учиться.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414695
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ты картинку выше видел (Debug 2005-й студии)?
Я уткнулся в место ошибки (в коде).

Картинку не видел. Ну и что там видно ? Переменная phase не инициализирована.
Инициализируй, если так всё просто , и всё будет ОК.

Но сдаётся мне, что не всё будет так просто.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414708
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И я могу затупить ф-цию даже через try...catch (сделав например cout << value, где с value проблемы) -у меня это в итоге получилось вроде.
Только код в этом случае идет дальше своим путем, и путь этот неверный,


Не пойдёт. SEH выкинет исключение, и стек раскрутится до ближайшего верхнего TRY/CATCH блока.

Дмитрий77я тут же получаю ошибку в другом месте, причем не в Opal а уже в ptlib (более общие ф-ции), а там уже логику не отследишь вообще никак.


Делай TRY/CATCH на самом верху логики работы.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414721
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSEH выкинет исключение, и стек раскрутится до ближайшего верхнего
TRY/CATCH блока.
И давно catch начал ловить SE вместо __except?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414861
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivSEH выкинет исключение, и стек раскрутится до ближайшего верхнего
TRY/CATCH блока.
И давно catch начал ловить SE вместо __except?..


Да не важно, все же поняли...
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414908
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНо сдаётся мне, что не всё будет так просто.
Там не просто.

Дебаг (опаловский) я включил, но он не много чего дает.

При нормальном течении событий должно быть так:
2013/10/02 22:07:54.593 PSimpleThread: 13016 OpalCon SetPhase from ReleasingPhase to ReleasedPhase for Call[Ca2cc2b7619]-EP<fax>[F8745179d20]
2013/10/02 22:07:54.593 PSimpleThread: 13016 PTLib Thread ended: name="PSimpleThread:13016", real=0.109, kernel=0.016 (14.6%), user=0.000 (0%), both=0.016 (14.6%)

Выполняется SetPhase (поток 13016), потом этот поток завершается (Thread ended). Все. Как он его завершает я понять не могу.

При ненормальном течении событий ф-ция SetPhase (вызывается из OpalConnection::OnReleased) крашит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void OpalConnection::OnReleased(){
...
  SetPhase(ReleasedPhase);
}


void OpalConnection::SetPhase(Phases phaseToSet)
{
  PTRACE(3, "OpalCon\tSetPhase from " << phase << " to " << phaseToSet << " for " << *this);

  PWaitAndSignal m(phaseMutex);

  // With next few lines we will prevent phase to ever go down when it
  // reaches ReleasingPhase - end result - once you call Release you never
  // go back.
  if (phase < ReleasingPhase || (phase == ReleasingPhase && phaseToSet == ReleasedPhase))
    phase = phaseToSet;
}


(если не мудрить, то дебаггер остановится на строчке, которая выделена красным -"this is the next statement that will be executed")

Если смотреть в дебаггере в *this и в phase,
то там везде будет
CXX0030 Error: expession can not be evaluated.

Т.е. *this по сути уже уничтожена на момент вызова.
Что я хочу попробовать сделать (и думаю этого достаточно).

1) Остановить поток
Код: plaintext
1.
Sleep (INFINITE);


Для остановки потока этого достаточно.
Если его не остановить, он понаделает делов.

2) Посмотреть логи и подумать/попробовать можно ли самозавершить поток (чтоб он не висел).

Т.е. при возникновении ошибки надо что-то сделать.
Вопрос: как все-таки правильно отловить ошибку .

Я например делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
void OpalConnection::SetPhase(Phases phaseToSet)
{
  try
  {
  cout << "OpalCon\tSetPhase from " << phase << " to " << phaseToSet << " for " << *this << "\n";
  }
  catch (...)
  {
    PTRACE(3, "Problem in SetPhase!");
    Sleep (INFINITE);
  }
  PTRACE(3, "OpalCon\tSetPhase from " << phase << " to " << phaseToSet << " for " << *this);

  PWaitAndSignal m(phaseMutex);

  // With next few lines we will prevent phase to ever go down when it
  // reaches ReleasingPhase - end result - once you call Release you never
  // go back.
  if (phase < ReleasingPhase || (phase == ReleasingPhase && phaseToSet == ReleasedPhase))
    phase = phaseToSet;
}

Он выкидывает меня на "красной строчке" после try catch. (желтая стрелочка в дебагере).
Такое ощущение что задница с "CXX0030 Error: expession can not be evaluated" может наступить в любой момент.
Т.е. на момент вызова еще не задница, а в момент выполнения уже задница, причем на любой строчке ф-ции.

Т.е. как все-таки правильно отловить любое исключение в приведенной ф-ции?
Ну, мне наверно пример кода нужен.
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414913
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77вызывается из OpalConnection::OnReleased
А откуда вызывается этот самый OnReleased? Что-то у меня чувство, что он вызывается уже
после освобождения объекта...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414922
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА откуда вызывается этот самый OnReleased?
Там все очень запутано.
Например отсюда. Но не исключено что еще откуда-то может.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
void OpalConnection::Release(CallEndReason reason)
{
  {
    PWaitAndSignal m(phaseMutex);
    if (phase >= ReleasingPhase) {
      PTRACE(2, "OpalCon\tAlready released " << *this);
      return;
    }
    SetPhase(ReleasingPhase);
  }

  if (synchronousOnRelease) {
    if (!LockReadWrite()) {
      PTRACE(2, "OpalCon\tAlready released " << *this);
      return;
    }

    PTRACE(3, "OpalCon\tReleasing " << *this);

    // Now set reason for the connection close
    SetCallEndReason(reason);

    UnlockReadWrite();

    OnReleased();
    return;
  }

  PTRACE(3, "OpalCon\tReleasing asynchronously " << *this);

  // Add a reference for the thread we are about to start
  SafeReference();
  PThread::Create(PCREATE_NOTIFIER(OnReleaseThreadMain), reason.AsInteger(),
                  PThread::AutoDeleteThread,
                  PThread::NormalPriority,
                  "OnRelease");
}


void OpalConnection::OnReleaseThreadMain(PThread &, INT reason)
{
  if (LockReadWrite()) {
    // Now set reason for the connection close
    SetCallEndReason(CallEndReason(reason));
	UnlockReadWrite();
  }

  OnReleased();

  PTRACE(4, "OpalCon\tOnRelease thread completed for " << *this);

  // Dereference on the way out of the thread
  SafeDereference();
}


Dimitry SibiryakovЧто-то у меня чувство, что он вызывается уже
после освобождения объекта...
У меня тоже такое чувство.
Думаю что он м.б. вызван дважды и трижды из разных мест, типа чтоб наверняка,
а при перекрестной бомбежке при большой нагрузке и дефеците времени какое-то условие может провериться неправильно.
Еще есть чувство что объект может освободиться в процессе выполнения OnReleased.
(т.е. когда принималось решение вызвать OnReleased, с объектом было все в порядке, а в процессе работы с объектом объект был разбомблен извне).

Т.е. я и хочу в SetPhase проверять что объект еще вменяем и если нет, то стопорить поток.
Как проверять?
...
Рейтинг: 0 / 0
А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
    #38414926
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Как проверять?
Не надо ничего проверять, поставь synchronousOnRelease в true.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / А реально ли найти ошибку глядя на this CXX0017: Error: simbol this not found
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]