|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Есть моя длл и не мой вызывающий эхэ Получаю такое Unhandled exception at 0x000007FEF8E08A89 (my.dll) in notmy.exe: 0xC0000005: Access violation writing location 0x000007FEF8EABBA8. occurred В отладчике вижу место где этот эскцепшын pfnDl = DllErrorHook; так и ранше было, никаких изменений в этом коде не было, возможно где-то в другом месте нарушается память. Как понять и выловить, где? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 15:17 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Странно, вроде трай-кетч стоит, но не ловит __try { pfnDl = DllErrorHook; } __except ((GetExceptionCode() & 0xffff) == ERROR_MOD_NOT_FOUND ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { *bLoaded = FALSE; } ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 16:18 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
либо скинь пример воспроизводящий твою ошибку, либо выкладывай нормальный стек вызовов/дамп c pdb-файлами, с описанием того, что ты пытаешься сделать и как (я надеюсь ты не пытаешься что-то вызывать, инициализировать в DllMain). Из того что ты сказал не понятно ровным счетом ничего, кроме того, что ты пытаешься присвоить один указатель на функцию, другому и хочешь чтобы ОС бросало тебе исключение. Зачем ей это делать? Это все равно, что попытаться присвоить null указателю на int* и надеяться что в момент присвоения ОС кинет тебе exception Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 18:04 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Cerebrumя надеюсь ты не пытаешься что-то вызывать, инициализировать в DllMain Это не приводит к крэшу. В худшем случае - дедлок. Ставлю на то, что pfnDl = мембер класса, а код вызывается с мусорным this. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 18:08 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Cerebrumлибо скинь пример воспроизводящий твою ошибку, либо выкладывай нормальный стек вызовов/дамп c pdb-файлами, с описанием того, что ты пытаешься сделать и как (я надеюсь ты не пытаешься что-то вызывать, инициализировать в DllMain). Из того что ты сказал не понятно ровным счетом ничего, кроме того, что ты пытаешься присвоить один указатель на функцию, другому и хочешь чтобы ОС бросало тебе исключение. Зачем ей это делать? Это все равно, что попытаться присвоить null указателю на int* и надеяться что в момент присвоения ОС кинет тебе exception Код: plaintext 1.
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 } ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 12:50 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
как и где объявлена __pfnDliFailureHook2 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 13:57 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Ролг ХупинСтранно, вроде трай-кетч стоит, но не ловитэто должно сразу настораживать на то что что-то не так с инициализацией рантайма ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2019, 18:45 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Cerebrumкак и где объявлена __pfnDliFailureHook2 ? она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа PQconnectdbParams ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 13:00 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Andy_OLAPРолг Хупин, Посмотрите Ваш пример - the class pointer was uninitialized - с пояснением внутри. Торможу неистово: в чем это похоже на мой пример? Там у них выезд за границу массива есть - ясно, но я с массивом не работаю. Неинициализированный указатель есть - но у меня просто присвоение указателю адреса функции... Если не трудно укажите, что именно там моё. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 13:04 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Ролг ХупинCerebrumкак и где объявлена __pfnDliFailureHook2 ? она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа PQconnectdbParams да это я нашел, но поскольку указатель на функцию объявлен как Код: plaintext 1.
то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже), поэтому я не исключаю того, что модуль, где он лежит: - либо не подключается в момент загрузки твоего кода (читал readme про то, что должно быть установлено на твоем ПК, чтобы работать с этой библиотекой ?) - либо он отрезан #define'ами проекта на этапе сборки ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 13:52 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
CerebrumРолг Хупинпропущено... она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа PQconnectdbParams да это я нашел, но поскольку указатель на функцию объявлен как Код: plaintext 1.
то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже), поэтому я не исключаю того, что модуль, где он лежит: - либо не подключается в момент загрузки твоего кода (читал readme про то, что должно быть установлено на твоем ПК, чтобы работать с этой библиотекой ?) - либо он отрезан #define'ами проекта на этапе сборки ок, вопрос: "то есть где-то в модуле c/cpp должен лежать PfnDliHook (посмотри что такое extern, если не уже)," это может быть и в х файле? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 14:11 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
CerebrumРолг Хупинпропущено... она объявлена в х файле постгресовской библиотеки, и хук нужен для вызова изнутри их функции, там в коде вызовы типа PQconnectdbParams да это я нашел, но поскольку указатель на функцию объявлен как Код: plaintext 1.
то есть где-то в модуле 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 14:17 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
я не работал с отложенной загрузкой, возможно кто-то еще подскажет что-то, если здесь не найдется ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 15:03 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
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; ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 15:18 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
Сделал эксперимент - объявил две локальных переменных типа PfnDliHook __pfnDliFailureHook22; PfnDliHook __pfnDliNotifyHook22 ; и присвоил им укзатель на функцию - все гуд, на этих операторах нет падения, а далее идут те, которые объявлены экстерны и чьи объвяления в delayimp.h - там писец сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 16:35 |
|
Как выловить причину ошибки?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)Ролг Хупин, __HrLoadAllImportsForDll пробовал вызывать? не, а зачем она мне? у меня какая-то странная проблема с присвоением указателю адреса функции для хука. Поведение такое, вроде срабатывает то, что они пишут для 17 студии, т.е. объявлен указатель константа Код: plaintext 1. 2. 3. 4. 5. 6.
Я уже и DELAYIMP_INSECURE_WRITABLE_HOOKS дефайнул , но поведение не изменилось. Объявил для эксперимента прямо в коде эти два указателя так PfnDliHook __pfnDliFailureHook2; - присвоились Что еще не так - не пойму.Почему остаются объявления констант ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2019, 18:07 |
|
|
start [/forum/topic.php?fid=57&msg=39770350&tid=2017671]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 158ms |
0 / 0 |