информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на InternetПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
1. Что-то во в этом роде я пробовал... 14.11.05 18:30  Число просмотров: 2848
Автор: duu Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1. Что-то во в этом роде я пробовал ...

struct sigaction saUser;
void UserSignal (int signum) { trow; } // здесь в разных комбинациях


memset (&saUser,0,sizeof(saUser));
saUser.sa_handler=&UserSignal;
sigaction (11,&saUser,NULL);

Но как восстановить (продолжить) работу приложения после перехвата 11 (SIGSEGV ) сигнала - у меня оно все время все равно погибает ?

2. Вы случайно отладкой многопотокового приложения не занимались ? Отладкой с помощью gdb ?
<beginners>
Обработка исключений с++ 13.11.05 23:56  
Автор: duu Статус: Незарегистрированный пользователь
<"чистая" ссылка>
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
try
{
int a;
for (int g=-11; g<11; g++) a=a/g; // деление на ноль
// throw 1;
}
catch(...)
{
printf(" >>> ");
return 0;
}

return 0;
}

Подскажите пожалуйста, как обрабатываются исключения
Должна ли (и почему у меня не выводится если должна / как сделать чтобы выводилась) выводиться строка printf(" >>> ");
никто не обещал, что c++-исключения обработают деление на ноль 14.11.05 00:11  
Автор: dl <Dmitry Leonov>
Отредактировано 14.11.05 00:16  Количество правок: 1
<"чистая" ссылка>
Это можно перехватить с помощью структурных исключений Win32. Есть вариант и скрестить - см.
_set_se_translator

Если очень на пальцах, то примерно так:
#include <eh.h>

class SE_Exception
{
private:
    unsigned int nSE;
public:
    SE_Exception() {}
    SE_Exception( unsigned int n ) : nSE( n ) {}
    ~SE_Exception() {}
    unsigned int getSeNumber() { return nSE; }
};

inline void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )
{
	throw SE_Exception(u);
}

inline void SetSETranslation()
{
	_set_se_translator( trans_func );
}

---

После чего аппаратные исключения будут приводить к c++-исключениям.
А в Линуксе как ??? 14.11.05 01:14  
Автор: duu Статус: Незарегистрированный пользователь
<"чистая" ссылка>
А в Линуксе как (на самом деле у меня в ней проблема с выходом за границы char массива) ?

Я, видимо, ошибаюсь, думая, что исключения вызвает ось при любой нештатной работе приложения. Правильно думать, что в реализации класса должнен быть сделан отлов (проверка) допустимых значений (например) и генерация throw, если "что-то не так" ???
Sigsegv 14.11.05 11:33  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> А в Линуксе как (на самом деле у меня в ней проблема с
> выходом за границы char массива) ?

SIGSEGV

> Я, видимо, ошибаюсь, думая, что исключения вызвает ось при
> любой нештатной работе приложения. Правильно думать, что в

Ось не заточена под C++. У нее есть собственная модель исключений, которую можно использовать в любом языке программирования. В винде это SEH (structured exception handling), в линуксе сигналы. В общем случае C++ исключения и "исключения" операционной системы не пересекаются (в лучшем случае C++ исключения являются надстройкой над ОСевыми, как это сделано например в винде).

> реализации класса должнен быть сделан отлов (проверка)
> допустимых значений (например) и генерация throw, если
> "что-то не так" ???

Можно не проверять каждый раз диапазоны, а ловить исключения операционной системы и кидать C++ (собственно примерно так и делает _se_translator, который предложил dl)
1. Что-то во в этом роде я пробовал... 14.11.05 18:30  
Автор: duu Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1. Что-то во в этом роде я пробовал ...

struct sigaction saUser;
void UserSignal (int signum) { trow; } // здесь в разных комбинациях


memset (&saUser,0,sizeof(saUser));
saUser.sa_handler=&UserSignal;
sigaction (11,&saUser,NULL);

Но как восстановить (продолжить) работу приложения после перехвата 11 (SIGSEGV ) сигнала - у меня оно все время все равно погибает ?

2. Вы случайно отладкой многопотокового приложения не занимались ? Отладкой с помощью gdb ?
Здесь 15.11.05 12:15  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> 1. Что-то во в этом роде я пробовал ...

> struct sigaction saUser;
> void UserSignal (int signum) { trow; } // здесь в разных
> комбинациях


> memset (&saUser,0,sizeof(saUser));
> saUser.sa_handler=&UserSignal;
> sigaction (11,&saUser,NULL);
>
> Но как восстановить (продолжить) работу приложения после
> перехвата 11 (SIGSEGV ) сигнала - у меня оно все время все
> равно погибает ?

Здесь

http://gcc.gnu.org/ml/gcc/1999-01n/msg00342.html

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

У меня есть мысль, что можно все сделать на основе setjmp/longjmp, только нужно быть ОЧЕНЬ осторожным с локальными переменными (посмотреть в отладчике правильно ли раскручивается стек после throw-а из кода, в который перешли по longjmp).

> 2. Вы случайно отладкой многопотокового приложения не
> занимались ? Отладкой с помощью gdb ?

Многопотокового - было, gdb - нет. Я виндовозник, а под виндой gdb существенно проигрывает микрософтовскому отладчику.
sigsetjmp/siglongjmp вроде дали какой-то результат ... (изучение продолжается ...) 18.11.05 21:40  
Автор: duu Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> У меня есть мысль, что можно все сделать на основе
> setjmp/longjmp, только нужно быть ОЧЕНЬ осторожным с
> локальными переменными (посмотреть в отладчике правильно ли
> раскручивается стек после throw-а из кода, в который
> перешли по longjmp).

sigsetjmp/siglongjmp вроде дали какой-то результат ... (изучение продолжается ...)

Я хотел спросить, может какой-нибудь есть хороший форум по линукс программированию (какие я самостоятельно нашел - вялотекущие какие-то) ?
именно так, throw кто-то должен вызвать 14.11.05 02:24  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach