Сейчас на форуме: zds (+5 невидимых)

 [email protected] —› Программирование —› try/ catch Access violation
Посл.ответ Сообщение


Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 20 января 2014 23:29
· Личное сообщение · #1

try {
if( mFileNames0 == 0 )
return 0;
}
catch(exception b)
{
return 0;

при попытке исполнения if( mFileNames0 == 0 ) получаю ошибку чтения по адрессу 0х00000080 и не страбатывает исклчение, что делать?

cString* mFileNames0;

-----
-=истина где-то рядом=-





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 января 2014 23:35 · Поправил: reversecode
· Личное сообщение · #2

не может такого быть

может все таки подразумевался if( *mFileNames0 == 0 ) ?




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 21 января 2014 00:19
· Личное сообщение · #3

да нет, подразумевается именно то, что написано в коде. Исключение тупо не срабатывает.

-----
-=истина где-то рядом=-





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 января 2014 00:22
· Личное сообщение · #4

исключение и не должно срабатывать

а для ловли того что вы хотите вам нужны другие виндовые ловли исключений
__try
__finally

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

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 января 2014 01:25
· Личное сообщение · #5

Си++ исключения не ловят исключения процессора. Они ловят всякие там throw. Но это я очень грубо выразился. Читайте описание __try и try методов.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 21 января 2014 16:46
· Личное сообщение · #6

int
Ловят-ловят. Только для этого в проекте надо ключ выставить (для студии) /EHa. И ловиться будут всякие иксепшены, даже если они и не были через throw выброшены, правда, для этого надо использовать конструкцию catch(...).

reversecode пишет:
а для ловли того что вы хотите вам нужны другие виндовые ловли исключений
__try
__finally


Подойдёт и _try ... __except. Но некрасиво. И, как бы, --> _set_se_translator <-- всё-таки выглядит несколько лучше.

И никто не читает мой блог (пичаль). --> Тут уже было<--

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 января 2014 16:55 · Поправил: reversecode
· Личное сообщение · #7

да я только наводку дал,
тем более не надо миксить стандартные с++ try итд, с M$-овскими вариациями
кросс платформенность убивается



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 января 2014 17:30
· Личное сообщение · #8

ARCHANGEL
Да я уже и не помню всех этих тонкостей. Кроме того, как уже правильно написал reversecode есть стандарт. И есть компании, работая в которых вы будете получать пизд**ей за нарушения стандартов. Хороший код работает везде где угодно, собирается любым компилятором и работает стабильно (кроме system specific задач). Я уже три года пишу софт в основном только под линукс и исключений у меня там не возникает. Писать надо уметь без исключений. Линукс очень хорошо воспитывает это (just google for segmentation fault). И не надо писать тут, что код получается не красивым. Пара проверок всяко красивее, чем переключения ring3 -> ring0 -> ring3 с вызовом десятков процедур для обработки исключений.

И да, прочитал ваш блог, вам F_a_u_s_t уже все объяснил.

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

Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 21 января 2014 18:16 · Поправил: dosprog
· Личное сообщение · #9

KingSise,
глюк при компиляции?...
Чтобы понять, в чём дело, я бы добавил (временно) проверку вроде такой:
if( &mFileNames0<400000) {/*Тут вывод сообщения, что какая-то лажа*/....;}
...нужно пробовать.

--ADD--
Archer,
1) согласен, верно будет 10000.
2) обычный if - так проще всего. Тем более, что потом это всё равно нужно удалить.







Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 января 2014 18:28
· Личное сообщение · #10

dosprog
Не совсем понятно, откуда взялось 400000, коль это динамически выделяемая память, уж тогда брать нижнюю невыделяемую границу в 0x10000. А во-вторых, для этого assert есть.
KingSise
А тут мне непонятно, откуда обращение к члену даёт ошибку чтения по адрессу 0х00000080. Сдаётся мне, это обращение в несуществующий экземпляр класса. И надо бы проверку делать где-то раньше, либо вообще такую бяку не писать, походу, проектирование хромает.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 января 2014 18:35
· Личное сообщение · #11

Archer пишет:
Сдаётся мне, это обращение в несуществующий экземпляр класса.

Я бы сказал код вырван из контекста. Можно делать очень много предположений на тему того, откуда ноги растут. И не факт, что именно mFileNames0 вызывает исключение, это лишь предположение автора, который явно не до конца понимает суть проблемы исключений. Я вот например не понимаю, откуда там вообще может быть исключение, если это обычный указатель, который проверяется на ноль - все вполне законно. Ошибка может быть где-то выше.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 21 января 2014 18:42 · Поправил: dosprog
· Личное сообщение · #12

int,
это испорченный, неверный указатель (сама переменная). Даже не "указатель в никуда". Ошибка компилятора или ошибка программиста.
Archer верно описал возможную причину.

Например, в самом простом случае, всё выглядит промерно так:

char* pStr = "Hello";

Тогда:
&pStr == 0x490000 (например) - зависит от компиляции (!) - Переменная времени компиляции - Дальше константа времени выполнения - Указатель на указатель на строку "Hello"
pStr == 0x650000 (например) - зависит от компиляции
- Переменная - Указатель на строку "Hello"
*pStr == "Hello" (точно!)


В примере глюка у KingSize &pStr==0x80. Естественно, обычной программе оттуда читать ничего нельзя.

P.S. Это всё в Си-шной терминологии. Не вдаваясь в ++.


--ADD-- К следующему посту,
int,
да. Я малость всё усложнил.






Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 21 января 2014 19:42
· Личное сообщение · #13

dosprog пишет:
&pStr==0x80

А где вы видите там амперсенд? reversecode специально переспросил про форму записи обращения к переменной. Указателю я могу присвоить что угодно и все хорошо, пока я не обратился по указателю. Ссылаться я могу хоть "в космос", фолт возникает, когда выполняется что-то вроде mov ebx, [edi], где edi равен 0x80. Но я слабо представляю, как может возникнуть фолт на инструкции mov ebx, edi или lea ebx,[edi].




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 21 января 2014 20:43
· Личное сообщение · #14

ARCHANGEL пишет:
reversecode пишет:а для ловли того что вы хотите вам нужны другие виндовые ловли исключений__try__finally


вот ответ на мой вопрос ;) Все получилось и работает отлично.

сделал так и все работает:


Code:
  1.          __try
  2.                  {
  3.                         if( mFileNames0 == 0 )
  4.                               return 0;
  5.                         //if((int) &mFileNames0  < 0x01000000 )
  6.                  }
  7.                  __except(EXCEPTION_ACCESS_VIOLATION)
  8.                  {
  9.                         return 0;
  10.                  }


-----
-=истина где-то рядом=-




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 21 января 2014 20:49 · Поправил: dosprog
· Личное сообщение · #15

KingSise,
.. то-есть, срабатывает __except(EXCEPTION_ACCESS_VIOLATION).
ну, что-ж...
Лучше бы найти ошибку (как и сказал int), а не "переваливаться" через неё. Впрочем, хозяин - барин.

P.S.
"if((int) &mFileNames0 < 0x010000 )" - нужно было проверять до "if(mFileNames0 ==0 )"
ну, да ладно.






Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 21 января 2014 21:31
· Личное сообщение · #16

KingSise пишет: Все получилось и работает отлично.
Скверное решение, где можно обойтись без капитуляции ( сепшенов ) там нужно обходится без нее.
Причины до тупого просты, с условиями код нагляднее, код должен контролироваться там, где это возможно и так же, должен быть предсказуем, а значит, он должен решаться условиями.
Сепшены нужны в редких случаях, когда контролировать результат затруднительно или вообще невозможно, все остальное, это ошибки проектирования.
Дело в том, когда проект изначально маленький, то код зачастую пишется небрежно, но по истечению времени, он начинает разрастаться, а старые костыли, как правило никто не убирает и в итоге каша вместо кода.
Это не говоря о том, что исключение может вызываться в одном месте, а обрабатываться в другом и мягко говоря, можно устать от беготни по обработчикам.
За __try.. уже говорил, для большинства задач достаточно стандартных try..
Итог, лучше заняться редизайном, а не подпирать костыли костылями, дальше будет больше и когда то это все рухнет.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 22 января 2014 13:28 · Поправил: reversecode
· Личное сообщение · #17

mFileNames0 видимо мембер класса, когда самого класса нет (this невалидный или нулевой) тогда ексепшен который мы наблюдаем




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 22 января 2014 23:28 · Поправил: Dr0p
· Личное сообщение · #18

ртловские фолты никакого отношения к железячным не имеют. Эта хуита вообще не понятно зачем придумана.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 23 января 2014 00:08 · Поправил: ARCHANGEL
· Личное сообщение · #19

int пишет:

Я уже три года пишу софт в основном только под линукс и исключений у меня там не возникает. Писать надо уметь без исключений. Линукс очень хорошо воспитывает это (just google for segmentation fault). И не надо писать тут, что код получается не красивым. Пара проверок всяко красивее, чем переключения ring3 -> ring0 -> ring3 с вызовом десятков процедур для обработки исключений.

Не, ну это ещё можно как-то понять, линукс, может, и воспитывает это - я не пробовал, не могу судить. Но смысл в исключениях есть. А вот это уже не лезет ни в какие ворота:

Dr0p пишет:
Эта хуита вообще не понятно зачем придумана.

Книга --> Чистый код. Создание, анализ и рефакторинг<--

с.132-133.



--> Ссылка на книгу для ознакомления<--

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 23 января 2014 00:18 · Поправил: reversecode
· Личное сообщение · #20

в линуксе тоже можно перехватывать сегфолыт и прочее, просто M$ это окучило под обработку исключений, что бы удобнее было пользоваться




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 24 января 2014 11:55
· Личное сообщение · #21

reversecode пишет:
mFileNames0 видимо мембер класса, когда самого класса нет (this невалидный или нулевой) тогда ексепшен который мы наблюдаем


Так и есть, не проверил создан ли класс. Как оказалось при некоторых условиях он не создается и проверка нужна.

-----
-=истина где-то рядом=-





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 24 января 2014 20:20
· Личное сообщение · #22

ARCHANGEL

Ну и что дальше ?

Ответа я не вижу. Среда генерит какие то виртуальные фолты, их должен обработать скрипт, а если не может, то всё отваливается к ём. Тут логический вывод один - говнище, как среда так и её рудименты.




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 24 января 2014 22:38 · Поправил: neomant
· Личное сообщение · #23

KingSise пишет:
Так и есть, не проверил создан ли класс. Как оказалось при некоторых условиях он не создается и проверка нужна.


На этот случай в конструкторе при невозможности создания объекта бросается исключение. Далее по стандартной схеме try/catch/finally, но уже без обращения по нулевым указателям.

-----
Следуй за белым кроликом



 [email protected] —› Программирование —› try/ catch Access violation
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати