Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обработать исключение? / 25 сообщений из 36, страница 1 из 2
02.11.2015, 18:36
    #39093111
как обработать исключение?
имеется функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
template<class T>
std::string variableToStr(const T &v)
{
	try
	{
		StrStream ss;
		ss<<v;
		string r=ss.str();
		return r;
	}
	catch(...)
	{
	}
	return "*failed-to-parse*";
}


которая в отличие от
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
template<class T>
std::string variableToStr(const T &v)
{
	//try
	//{
	//	StrStream ss;
	//	ss<<v;
	//	string r=ss.str();
	//	return r;
	//}
	//catch(...)
	//{
	//}
	return "*failed-to-parse*";
}



выдаёт исключение , т.е. исключение не перехватывается блоком catch(...)
...
Рейтинг: 0 / 0
02.11.2015, 18:37
    #39093113
как обработать исключение?
подскажите, пожалуйста, как такое обрабатывать
...
Рейтинг: 0 / 0
02.11.2015, 19:10
    #39093148
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659
выдаёт исключение , т.е. исключение не перехватывается блоком catch(...)

Это не исключение, это ASSERT.
Именно поэтому оно и не перехватывается -- если ты нажмёшь "пропустить", возможно, фукнция и сработает, как тебе надо.
...
Рейтинг: 0 / 0
02.11.2015, 20:22
    #39093194
как обработать исключение?
увы всё оказалось не так просто.
функция variableToStr находится в dll, которая injectится в чужую программу.
ошибка возникает независимо от того как собрана dll,
с дебажной версией вылетает окно, с релизной - программа просто падает.
...
Рейтинг: 0 / 0
03.11.2015, 00:08
    #39093249
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659,

random_account_11367934659функция variableToStr находится в dll
Нет, она находится в хедере, потому что это шаблонная функция.
...
Рейтинг: 0 / 0
03.11.2015, 01:11
    #39093267
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659подскажите, пожалуйста, как такое обрабатывать

как такое отрабатывать чтобы ЧТО?
...
Рейтинг: 0 / 0
03.11.2015, 01:32
    #39093271
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
MasterZivrandom_account_11367934659подскажите, пожалуйста, как такое обрабатывать

как такое отрабатывать чтобы ЧТО?
Помниться ты утверждал, что из ДЛЛ можно возвращать что угодно, а не только POD =)

Вот теперь обоснуй на примере.
...
Рейтинг: 0 / 0
03.11.2015, 12:18
    #39093574
как обработать исключение?
MasterZivrandom_account_11367934659подскажите, пожалуйста, как такое обрабатывать

как такое отрабатывать чтобы ЧТО?
чтобы приложение не валилось.

ещё раз:

сделал dll в которой переопределяются стандартные winapi - шные вызовы (CreateFileA и т.п.)
dll inject-иться в стороннее приложение, заменяя в нём соотв. функции на функции из dll.
dll версии в отличие от оригинальных добавляют логирование в файл.
На тестовом приложении всё работает чётко, на реальном - возникает сабжевая проблема.
(видимо в функцию передаётся битый параметр)

ошибка возникает при детерминорованной последовательности действий.
- с дебажной версией dll вылетает assert-овое окно, если нажать "пропустить" программа вылетает (убивается drwtsn'ом)
- с релизной версией dll - тот же результат, но без диалогового окна
- с dll, у которой закомментирован участок кода, ошибки не возникает
...
Рейтинг: 0 / 0
03.11.2015, 12:42
    #39093601
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
Я же тебе намекнул - используй POD, Люк!
https://ru.wikipedia.org/wiki/Простая_структура_данных

Вероятно, у тебя зоопарк CRT в твоей DLL и вызывающей программы.

А с Мастером мы еще пообсуждаем)
...
Рейтинг: 0 / 0
03.11.2015, 12:49
    #39093612
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
ЗимарглВероятно, у тебя зоопарк CRT в твоей DLL и вызывающей программы.
Как вариант попробовать статическую сборку. Ключ /MT компилятора.
...
Рейтинг: 0 / 0
03.11.2015, 13:26
    #39093674
как обработать исключение?
Dima TЗимарглВероятно, у тебя зоопарк CRT в твоей DLL и вызывающей программы.
Как вариант попробовать статическую сборку. Ключ /MT компилятора.
это я попробовал первым делом, увы не помогло
...
Рейтинг: 0 / 0
03.11.2015, 13:31
    #39093679
как обработать исключение?
ЗимарглЯ же тебе намекнул - используй POD, Люк!
https://ru.wikipedia.org/wiki/Простая_структура_данных

определить функцию для разных типов - способ очевидный,
но какой-то ненаучный:)


ЗимарглВероятно, у тебя зоопарк CRT в твоей DLL и вызывающей программы.

разумеется в вызывающей программе может быть любой зоопарк
...
Рейтинг: 0 / 0
03.11.2015, 13:43
    #39093703
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
ЗимарглMasterZivпропущено...


как такое отрабатывать чтобы ЧТО?
Помниться ты утверждал, что из ДЛЛ можно возвращать что угодно, а не только POD =)

Вот теперь обоснуй на примере.


а при чем тут это?
...
Рейтинг: 0 / 0
03.11.2015, 13:46
    #39093710
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
ЗимарглЯ же тебе намекнул - используй POD, Люк!
https://ru.wikipedia.org/wiki/Простая_структура_данных

Вероятно, у тебя зоопарк CRT в твоей DLL и вызывающей программы.

А с Мастером мы еще пообсуждаем)

ну давай, у него там 0указатель, а ты про какие то POD заливаешь...
...
Рейтинг: 0 / 0
03.11.2015, 13:48
    #39093714
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
Dima TЗимарглВероятно, у тебя зоопарк CRT в твоей DLL и вызывающей программы.
Как вариант попробовать статическую сборку. Ключ /MT компилятора.


ребята, что вы тут гоните?
у его dll, значит статическая сборка уже идет лесом....
...
Рейтинг: 0 / 0
03.11.2015, 13:50
    #39093718
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659Dima Tпропущено...

Как вариант попробовать статическую сборку. Ключ /MT компилятора.
это я попробовал первым делом, увы не помогло

дорогой коллега, сначала найди причину ассерта, и исправь программу, чтобы его не было.
потом будешь что-то там собирать уже...
...
Рейтинг: 0 / 0
03.11.2015, 13:53
    #39093724
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659ЗимарглЯ же тебе намекнул - используй POD, Люк!
https://ru.wikipedia.org/wiki/Простая_структура_данных

определить функцию для разных типов - способ очевидный,
но какой-то ненаучный:)

Шаблоны использовать тебе никто не мешает. Главное не возвращай вызывающей программе объекты с "чужим" хипом

MasterZivЗимарглпропущено...
Помниться ты утверждал, что из ДЛЛ можно возвращать что угодно, а не только POD =)
Вот теперь обоснуй на примере.
а при чем тут это?
Так это пример "как делать не надо" из этой области.
...
Рейтинг: 0 / 0
03.11.2015, 13:56
    #39093734
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
MasterZivDima Tпропущено...

Как вариант попробовать статическую сборку. Ключ /MT компилятора.
ребята, что вы тут гоните?
у его dll, значит статическая сборка уже идет лесом....
Почему? Чем DLL от EXE отличается ?

Затестил по тупому: создал новый DLL-проект, скомпилировал с /MD и /MT - размер 7 и 41 кб, т.е. ключик учитывается.
...
Рейтинг: 0 / 0
03.11.2015, 14:23
    #39093770
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
Dima TMasterZivпропущено...

ребята, что вы тут гоните?
у его dll, значит статическая сборка уже идет лесом....
Почему? Чем DLL от EXE отличается ?
.

Потому. Потому что. ODR .

Dima TЗатестил по тупому: создал новый DLL-проект, скомпилировал с /MD и /MT - размер 7 и 41 кб, т.е. ключик учитывается.


Все знают, что азотом дышать нельзя.
Я затестил по-тупому. Купил воздушный шарик, и вдохнул.
И ничего, живой...

Давай так: хочешь об этом поговорить -- создай новый топик. А ещё можешь поискать -- дофига обсасывалось.
...
Рейтинг: 0 / 0
03.11.2015, 14:24
    #39093775
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
Зимарглrandom_account_11367934659пропущено...

определить функцию для разных типов - способ очевидный,
но какой-то ненаучный:)

Шаблоны использовать тебе никто не мешает. Главное не возвращай вызывающей программе объекты с "чужим" хипом

MasterZivпропущено...

а при чем тут это?
Так это пример "как делать не надо" из этой области.

Почему не надо ?

Я вижу вообще шаблонную функцию, которая возвращает std::string -- шаблонный же класс.

Почему бы ей не вызываться из .DLL ?
...
Рейтинг: 0 / 0
03.11.2015, 14:30
    #39093783
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659увы всё оказалось не так просто.
функция variableToStr находится в dll, которая injectится в чужую программу.
ошибка возникает независимо от того как собрана dll,
с дебажной версией вылетает окно, с релизной - программа просто падает.

А, вот этого я кстати не заметил (всё в метро...).

Тогда, боюсь, что Зимаргл действительно прав.
Ты не можешь накладывать на приложение, куда иньектится твоя DLL никакие ограничения.
И ты вообще не можешь использовать ни STL, ни CRT. Только WinAPI.
(ну т.е. на самом деле можешь, но аккуратно, но ты, видимо, аккуратно не умеешь...)
...
Рейтинг: 0 / 0
03.11.2015, 14:52
    #39093806
как обработать исключение?
MasterZivrandom_account_11367934659пропущено...

это я попробовал первым делом, увы не помогло

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

ошибку я нашёл - скорее всего это access violation , её можно воспроизвести на простом тестовом приложении:
собираю компилятором msvc2008
Код: 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.
55.
56.
57.
58.
59.
60.
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

class StrStream
{
	std::stringbuf _buffer;             // empty buffer
	std::ostream _os;      // associate stream buffer to stream
public:
	StrStream():_os(&_buffer)
	{
	}
	template<typename T>
	StrStream &operator<<(const T &v)
	{
		try
		{
			_os<<v;
		}
		catch(...)
		{
			try
			{
				_os<<"*failed*";
			}
			catch(...)
			{

			}
		}
		return *this;
	}
	std::string str()const
	{
		return _buffer.str();
	}
};


int main(int argc, char* argv[])
{
	string* buf=(string*)0x00F0000;
	try
	{
		StrStream ss;
		ss<<*buf;
		string sss=ss.str();
	}
	catch(...)
	{
		cout<<"opa"<<endl;
	}
	cout<<"ok"<<endl;

	getchar();
	return 0;
}


собственно, я думал, что она ловится c catch(...), но, видимо, я был не прав
...
Рейтинг: 0 / 0
03.11.2015, 15:10
    #39093835
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
Это ошибка доступа к несуществующей памяти. try...catch ее не ловит. Используй для проверки IsBadReadPtr() или SEH
...
Рейтинг: 0 / 0
03.11.2015, 15:14
    #39093846
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
random_account_11367934659,

А что это за хрень ?

Код: plaintext
1.
string* buf=(string*)0x00F0000;
...
Рейтинг: 0 / 0
03.11.2015, 16:48
    #39093954
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как обработать исключение?
Неплохая подборка анализа граблей для данного случая

http://stackoverflow.com/questions/22797418/how-do-i-safely-pass-objects-especially-stl-objects-to-and-from-a-dll
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обработать исключение? / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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