powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обработать исключение?
36 сообщений из 36, показаны все 2 страниц
как обработать исключение?
    #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
как обработать исключение?
    #39093113
подскажите, пожалуйста, как такое обрабатывать
...
Рейтинг: 0 / 0
как обработать исключение?
    #39093148
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
random_account_11367934659
выдаёт исключение , т.е. исключение не перехватывается блоком catch(...)

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

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

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

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

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

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

ещё раз:

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

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

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

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

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


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

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Тогда, боюсь, что Зимаргл действительно прав.
Ты не можешь накладывать на приложение, куда иньектится твоя DLL никакие ограничения.
И ты вообще не можешь использовать ни STL, ни CRT. Только WinAPI.
(ну т.е. на самом деле можешь, но аккуратно, но ты, видимо, аккуратно не умеешь...)
...
Рейтинг: 0 / 0
как обработать исключение?
    #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
как обработать исключение?
    #39093835
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ошибка доступа к несуществующей памяти. try...catch ее не ловит. Используй для проверки IsBadReadPtr() или SEH
...
Рейтинг: 0 / 0
как обработать исключение?
    #39093846
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
random_account_11367934659,

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

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

http://stackoverflow.com/questions/22797418/how-do-i-safely-pass-objects-especially-stl-objects-to-and-from-a-dll
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094019
Dima TЭто ошибка доступа к несуществующей памяти. try...catch ее не ловит. Используй для проверки IsBadReadPtr() или SEH
спасибо,
IsBadReadPtr оказалась бесполезной,
а вот соответствующая опция компилятора - то, что нужно
и работает как на тестовом примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int main(int argc, char* argv[])
{
	string* buf=(string*)0x00F0000;
	try
	{
		string tmp=*buf;
	}
	catch(...)
	{
		cout<<"opa"<<endl;
	}
	cout<<"ok"<<endl;
	getchar();
	return 0;
}


так и на самом проекте
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094020
MasterZivrandom_account_11367934659,

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

Код: plaintext
1.
string* buf=(string*)0x00F0000;


моделирование access violation
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094023
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
random_account_11367934659IsBadReadPtr оказалась бесполезной,

У меня работает
Код: plaintext
1.
2.
3.
4.
5.
	string* buf=(string*)0x00F0000;
	if(IsBadReadPtr(buf, sizeof(string))) {
		cout<<"bad ptr"<<endl;
	} else {
...


или
Код: plaintext
1.
2.
3.
4.
5.
6.
	StrStream &operator<<(const T &v)
	{
		if(IsBadReadPtr(&v, sizeof(T))) {
			cout<<"bad ptr 2"<<endl;
		} else {
...
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094025
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не телепат, но что-то подсказывает что у тебя накосячено в приведении типов. Смотри там откуда << вызывается.
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094026
ЗимарглНеплохая подборка анализа граблей для данного случая

http://stackoverflow.com/questions/22797418/how-do-i-safely-pass-objects-especially-stl-objects-to-and-from-a-dll
к данному случаю это не имеет отношения, у меня объекты передаются по ссылке в натуральном виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
//---------------------------------------------
Exe
func(HANDLE h)//original
{

}

//---------------------------------------------
Dll

template<typename T>
void handle_1(const T &v)
{
...
   list<string> params;
   params.push_back(variableToStr(v));
...
}

func(HANDLE h)//hook
{
   handle_1(h);
}


так, что насчёт граблей и прочего - это ваши домыслы
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094028
Dima Trandom_account_11367934659IsBadReadPtr оказалась бесполезной,

У меня работает
Код: plaintext
1.
2.
3.
4.
5.
	string* buf=(string*)0x00F0000;
	if(IsBadReadPtr(buf, sizeof(string))) {
		cout<<"bad ptr"<<endl;
	} else {
...


или
Код: plaintext
1.
2.
3.
4.
5.
6.
	StrStream &operator<<(const T &v)
	{
		if(IsBadReadPtr(&v, sizeof(T))) {
			cout<<"bad ptr 2"<<endl;
		} else {
...


на тестовом примере не проверял, на реальном - не работает, это точно
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094032
Dima TНе телепат, но что-то подсказывает что у тебя накосячено в приведении типов. Смотри там откуда << вызывается.
ошибка залогировалась:

[3/11/2015-19:13:43::640] CloseHandle(00000768)->1
[3/11/2015-19:13:43::640] CloseHandle(00000714)->1
[3/11/2015-19:13:43::687] DeleteFileW(*failed-to-write(PCWSTR)*)->0
[3/11/2015-19:13:43::703] CloseHandle(00000894)->1
[3/11/2015-19:13:43::703] CloseHandle(0000089C)->1

собственно, судя по тому, что функция возвратила 0 (FALSE) можно предполоожить, что параметр - косячный.
а может быть я накосячил с переводом PCWSTR в string:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
std::string WStrToStr(const std::wstring& s)  
{  
    std::string temp(s.length(), ' ');  
    std::copy(s.begin(), s.end(), temp.begin());  
    return temp;  
}  

template<>
StrStream &StrStream::operator<<(const PCWSTR &s)
{
	try
	{
		_os<<"L\""<<WStrToStr(s)<<"\"";
	}
	catch(...)
	{
		_os<<"*failed-to-write(PCWSTR)*";
	}
	return *this;
}
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094046
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
random_account_11367934659сделал dll в которой переопределяются стандартные winapi - шные вызовы (CreateFileA и т.п.)
....
random_account_11367934659а может быть я накосячил с переводом PCWSTR в string:
Зачем тебе Wide char в коде DLL?
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094054
Dima Trandom_account_11367934659сделал dll в которой переопределяются стандартные winapi - шные вызовы (CreateFileA и т.п.)
....
random_account_11367934659а может быть я накосячил с переводом PCWSTR в string:
Зачем тебе Wide char в коде DLL?
потому, что они есть в EXE. Причём, их там больше, чем аналогичных char-овских.
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
random_account_11367934659,

Ты какого-то трояна пишешь, все это прекрасно поняли, подсказок больше не будет, дальше сам.
...
Рейтинг: 0 / 0
как обработать исключение?
    #39094113
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавил это в фок, надо бы перевести потом...
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обработать исключение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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