powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как выловить причину ошибки?
18 сообщений из 18, страница 1 из 1
Как выловить причину ошибки?
    #39769276
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть моя длл и не мой вызывающий эхэ
Получаю такое

Unhandled exception at 0x000007FEF8E08A89 (my.dll) in notmy.exe: 0xC0000005: Access violation writing location 0x000007FEF8EABBA8. occurred

В отладчике вижу место где этот эскцепшын

pfnDl = DllErrorHook;

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

Как понять и выловить, где?
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769305
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, вроде трай-кетч стоит, но не ловит

__try {
pfnDl = DllErrorHook;
}
__except ((GetExceptionCode() & 0xffff) == ERROR_MOD_NOT_FOUND ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
*bLoaded = FALSE;
}
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769367
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
либо скинь пример воспроизводящий твою ошибку, либо выкладывай нормальный стек вызовов/дамп c pdb-файлами, с описанием того, что ты пытаешься сделать и как (я надеюсь ты не пытаешься что-то вызывать, инициализировать в DllMain).

Из того что ты сказал не понятно ровным счетом ничего, кроме того, что ты пытаешься присвоить один указатель на функцию, другому и хочешь чтобы ОС бросало тебе исключение.

Зачем ей это делать?

Это все равно, что попытаться присвоить null указателю на int* и надеяться что в момент присвоения ОС кинет тебе exception

Код: plaintext
1.
int* pI = nullptr; // о нет! exception!
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769368
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumя надеюсь ты не пытаешься что-то вызывать, инициализировать в DllMain

Это не приводит к крэшу. В худшем случае - дедлок. Ставлю на то, что pfnDl = мембер
класса, а код вызывается с мусорным this.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769605
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumлибо скинь пример воспроизводящий твою ошибку, либо выкладывай нормальный стек вызовов/дамп c pdb-файлами, с описанием того, что ты пытаешься сделать и как (я надеюсь ты не пытаешься что-то вызывать, инициализировать в DllMain).

Из того что ты сказал не понятно ровным счетом ничего, кроме того, что ты пытаешься присвоить один указатель на функцию, другому и хочешь чтобы ОС бросало тебе исключение.

Зачем ей это делать?

Это все равно, что попытаться присвоить null указателю на int* и надеяться что в момент присвоения ОС кинет тебе exception

Код: plaintext
1.
int* pI = nullptr; // о нет! exception!



https://git.postgresql.org/gitweb/?p=psqlodbc.git;a=blob;f=loadlib.c;h=df958867898e7f6ecfb07b993946987a4f43a11b;hb=90b1df1f1c46717af634977a1eeba975059f2248

В начале - функция для хуков (строка 139):
static FARPROC WINAPI DliErrorHook(unsigned dliNotify, PDelayLoadInfo pdli)


Вот тут падение, при этом улетает без попадания в эксцепшн

void *CALL_PQconnectdbParams(const char *opts[], const char *vals[], BOOL *libpqLoaded)
399 {
400 void *pqconn = NULL;
401 *libpqLoaded = TRUE;
402 #if defined(_MSC_DELAY_LOAD_IMPORT)
403 __try {
404 #if (_MSC_VER < 1300)
405 __pfnDliFailureHook = DliErrorHook;
406 __pfnDliNotifyHook = DliErrorHook;
407 #else
408 __pfnDliFailureHook2 = DliErrorHook; //<----------------------!!! crash
409 __pfnDliNotifyHook2 = DliErrorHook;
410 #endif /* _MSC_VER */
411 inolog("calling PQconnectdbParams\n");
412 pqconn = PQconnectdbParams(opts, vals, 0);
413 }
414 __except ((GetExceptionCode() & 0xffff) == ERROR_MOD_NOT_FOUND ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
415 *libpqLoaded = FALSE;
416 }
417 #if (_MSC_VER < 1300)
418 __pfnDliNotifyHook = NULL;
419 #else
420 __pfnDliNotifyHook2 = NULL;
421 #endif /* _MSC_VER */
422 if (*libpqLoaded)
423 {
424 loaded_libpq = TRUE;
425 /* ssllibs are already loaded by libpq
426 if (PQgetssl(pqconn))
427 loaded_ssllib = TRUE;
428 */
429 }
430 #else
431 pqconn = PQconnectdbParams(opts, vals, 0);
432 #endif /* _MSC_DELAY_LOAD_IMPORT */
433 return pqconn;
434 }
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769654
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как и где объявлена __pfnDliFailureHook2 ?
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769819
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинСтранно, вроде трай-кетч стоит, но не ловитэто должно сразу настораживать на то что что-то не так с инициализацией рантайма
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39769823
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Посмотрите Ваш пример - the class pointer was uninitialized - с пояснением внутри.
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770113
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumкак и где объявлена __pfnDliFailureHook2 ?


она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа
PQconnectdbParams
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770117
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPРолг Хупин,

Посмотрите Ваш пример - the class pointer was uninitialized - с пояснением внутри.


Торможу неистово: в чем это похоже на мой пример?
Там у них выезд за границу массива есть - ясно, но я с массивом не работаю.
Неинициализированный указатель есть - но у меня просто присвоение указателю адреса функции...

Если не трудно укажите, что именно там моё.
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770140
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинCerebrumкак и где объявлена __pfnDliFailureHook2 ?


она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа
PQconnectdbParams
да это я нашел, но поскольку указатель на функцию объявлен как
Код: plaintext
1.
extern PfnDliHook __pfnDliFailureHook2;


то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже),
поэтому я не исключаю того, что модуль, где он лежит:
- либо не подключается в момент загрузки твоего кода (читал readme про то, что должно быть установлено на твоем ПК, чтобы работать с этой библиотекой ?)
- либо он отрезан #define'ами проекта на этапе сборки
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770154
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumРолг Хупинпропущено...



она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа
PQconnectdbParams
да это я нашел, но поскольку указатель на функцию объявлен как
Код: plaintext
1.
extern PfnDliHook __pfnDliFailureHook2;


то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже),
поэтому я не исключаю того, что модуль, где он лежит:
- либо не подключается в момент загрузки твоего кода (читал readme про то, что должно быть установлено на твоем ПК, чтобы работать с этой библиотекой ?)
- либо он отрезан #define'ами проекта на этапе сборки

ок, вопрос:
"то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже),"

это может быть и в х файле?
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770159
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumРолг Хупинпропущено...



она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа
PQconnectdbParams
да это я нашел, но поскольку указатель на функцию объявлен как
Код: plaintext
1.
extern PfnDliHook __pfnDliFailureHook2;


то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже),
поэтому я не исключаю того, что модуль, где он лежит:
- либо не подключается в момент загрузки твоего кода (читал readme про то, что должно быть установлено на твоем ПК, чтобы работать с этой библиотекой ?)
- либо он отрезан #define'ами проекта на этапе сборки


Я не прав, вот оно
PfnDliHook __pfnDliFailureHook2;

в студийном файле
D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\delayimp.h
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770194
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не работал с отложенной загрузкой, возможно кто-то еще подскажет что-то, если здесь не найдется ответ
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770209
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumя не работал с отложенной загрузкой, возможно кто-то еще подскажет что-то, если здесь не найдется ответ

Думал это не важно, но: когда моя длл строилась VS2010 этой проблемы не было,
когда стал строить VS2017 - появилась.
Вот что написано в студийном delayimp.h
"Prior to Visual Studio 2015 Update 3, these hooks were non-const."

автор
...
//
// Hook pointers
//

// The "notify hook" gets called for every call to the
// delay load helper. This allows a user to hook every call and
// skip the delay load helper entirely.
//
// dliNotify == {
// dliStartProcessing |
// dliNotePreLoadLibrary |
// dliNotePreGetProc |
// dliNoteEndProcessing}
// on this call.
//
// Prior to Visual Studio 2015 Update 3, these hooks were non-const. They were
// made const to improve security (global, writable function pointers are bad).
// If for backwards compatibility you require the hooks to be writable, define
// the macro DELAYIMP_INSECURE_WRITABLE_HOOKS prior to including this header and
// provide your own non-const definition of the hooks.
ExternC
#ifndef DELAYIMP_INSECURE_WRITABLE_HOOKS
const
#endif
PfnDliHook __pfnDliNotifyHook2;

// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
#ifndef DELAYIMP_INSECURE_WRITABLE_HOOKS
const
#endif
PfnDliHook __pfnDliFailureHook2;
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770272
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал эксперимент - объявил две локальных переменных типа
PfnDliHook __pfnDliFailureHook22;
PfnDliHook __pfnDliNotifyHook22 ;

и присвоил им укзатель на функцию - все гуд, на этих операторах нет падения, а далее идут те, которые объявлены экстерны и чьи объвяления в delayimp.h - там писец сразу.
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770342
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

__HrLoadAllImportsForDll пробовал вызывать?
...
Рейтинг: 0 / 0
Как выловить причину ошибки?
    #39770350
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Ролг Хупин,

__HrLoadAllImportsForDll пробовал вызывать?

не, а зачем она мне?
у меня какая-то странная проблема с присвоением указателю адреса функции для хука.
Поведение такое, вроде срабатывает то, что они пишут для 17 студии, т.е. объявлен указатель константа

Код: plaintext
1.
2.
3.
4.
5.
6.
// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
#ifndef DELAYIMP_INSECURE_WRITABLE_HOOKS
const
#endif
PfnDliHook __pfnDliFailureHook2;



Я уже и DELAYIMP_INSECURE_WRITABLE_HOOKS дефайнул , но поведение не изменилось.
Объявил для эксперимента прямо в коде эти два указателя так
PfnDliHook __pfnDliFailureHook2;

- присвоились

Что еще не так - не пойму.Почему остаются объявления констант
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как выловить причину ошибки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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