Re[7]: Exception from dll -> dll unload -> AV
От: blackhearted Украина  
Дата: 27.01.10 13:42
Оценка:
Здравствуйте, Тот кто сидит в пруду, Вы писали:

ТКС>Здравствуйте, blackhearted, Вы писали:


ТКС>Так не бывает, в указанной строке нечему падать. Можно предположить, что на самом деле упало на call eax. eax чему равен — не 0x10004be0 (из первого сообщения) случаем? У lib __vptr или как его там не порушен ли уже?


Уже порушен — dll выгружена.


_ZwRaiseException@12:
7C90D9AE mov eax,0B5h
7C90D9B3 mov edx,7FFE0300h
7C90D9B8 call dword ptr [edx]
7C90D9BA ret 0Ch


EAX = 000000B5 EBX = 00000000 ECX = 00000206 EDX = 7FFE0300 ESI = 0012F5D4 EDI = 0012F5D4 EIP = 7C90D9B8 ESP = 0012F250 EBP = 0012F534 EFL = 00000206

7FFE0300 = 7C90E510



_KiFastSystemCall@0:
7C90E510 mov edx,esp
7C90E512 sysenter

EAX = 000000B5 EBX = 00000000 ECX = 00000206 EDX = 0012F24C ESI = 0012F5D4 EDI = 0012F5D4 EIP = 7C90E512 ESP = 0012F24C EBP = 0012F534 EFL = 00000206


на sysenter падает

Re[6]: Exception from dll -> dll unload -> AV
От: blackhearted Украина  
Дата: 27.01.10 13:47
Оценка:
Здравствуйте, ononim, Вы писали:

O>Кроме того немного непонятно зачем делать проект состоящий из кучи разных длл, если условием нормальной работы которого является то, чтобы они были скомпилены все вместе одним компилятором и с одним и тем же набором разных либ, то есть фактически — чтоб это былоа единая компиляция. Не проще ли в таком случае сделать монолитный модуль, к чему эти длл?


dll к тому,что — это подключаемые модули, которые нет смысла отдавать статически влинкованными всем клиентам.
В качестве замены предлагается статичеки компилировать разные версии для разных клиентов?
Re[6]: Exception from dll -> dll unload -> AV
От: Тот кто сидит в пруду Россия  
Дата: 27.01.10 13:52
Оценка:
Здравствуйте, ononim, Вы писали:

O>Кроме того немного непонятно зачем делать проект состоящий из кучи разных длл, если условием нормальной работы которого является то, чтобы они были скомпилены все вместе одним компилятором и с одним и тем же набором разных либ, то есть фактически — чтоб это былоа единая компиляция. Не проще ли в таком случае сделать монолитный модуль, к чему эти длл?


На времени линковки можно сильно сэкономить, в случае разных dll.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: Exception from dll -> dll unload -> AV
От: Кодт Россия  
Дата: 27.01.10 13:52
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

K_O>Угу. Позволю сделать предположение, что STL'ные классы не являются частью CRT, поэтому опция MD(d) — что мертвому припарка: таблица виртуальных методов std::exception, порожденной в DLL физически находится в этой (выгруженной) DLL, отсюда и свал при попытке обратиться к виртуальному методу. Правила работы с менеджером памяти (хотя и являются здравым советом) в данном конкретном случае ни при чем.


Посмотрел на определение std::exception — оно содержит __declspec(dllimport), во всяком случае, если компилировать с /MD(d).
Так что vtable должно жить в msvcrt(d).dll
Перекуём баги на фичи!
Re[2]: Exception from dll -> dll unload -> AV
От: blackhearted Украина  
Дата: 27.01.10 13:53
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, blackhearted, Вы писали:


B>>dll бросает исключение.

B>>Его ловит Dummy::go() и в catch выгружает dll (в реальном приложении выгрузка происходит в другом потоке ниже по стеку,но результат тот же).

GN>Можно посмотреть на реальный вариант, включая call-stack?


try {        
    component->init();
  } catch (const Exception& ex) {
    log->fatal("failed to initialize: " 
      + ex.what());
    component->detach();
    component->shutdown();// тут уходит в другой поток, который делает FreeLibrary    
    throw;
  }



***.exe!_NMSG_WRITE(int rterrnum=10) Line 198 C
***.exe!abort() Line 59 + 0x7 bytes C
***.exe!_wassert(const wchar_t * expr=0x04e33520, const wchar_t * filename=0x04e334e0, unsigned int lineno=448) Line 212 C
***.exe!`anonymous namespace'::trans_func(unsigned int u=3221225477, _EXCEPTION_POINTERS * ptr=0x062acf4c) Line 448 + 0x18 bytes C++
***.exe!_CallSETranslator(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, void * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 701 + 0xd bytes C++
***.exe!FindHandlerForForeignException(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, _CONTEXT * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, int curState=0, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 934 + 0x21 bytes C++
***.exe!FindHandler(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, _CONTEXT * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, unsigned char recursive=0, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 866 + 0x25 bytes C++
***.exe!__InternalCxxFrameHandler(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, _CONTEXT * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000, unsigned char recursive=0) Line 524 + 0x25 bytes C++
***.exe!__CxxFrameHandler3(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, void * pContext=0x062ad194, void * pDC=0x062ad14c) Line 365 + 0x1f bytes C++
ntdll.dll!ExecuteHandler2@20() + 0x26 bytes
ntdll.dll!ExecuteHandler@20() + 0x24 bytes
ntdll.dll!_KiUserExceptionDispatcher@8() + 0xe bytes
***.exe!FindHandler(EHExceptionRecord * pExcept=0x062ad5fc, EHRegistrationNode * pRN=0x062aff48, _CONTEXT * pContext=0x062ad61c, void * pDC=0x062ad5d0, const _s_FuncInfo * pFuncInfo=0x0545ac24, unsigned char recursive=0, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 740 + 0x6 bytes C++
***.exe!__InternalCxxFrameHandler(EHExceptionRecord * pExcept=0x062ad5fc, EHRegistrationNode * pRN=0x062aff48, _CONTEXT * pContext=0x062ad61c, void * pDC=0x062ad5d0, const _s_FuncInfo * pFuncInfo=0x0545ac24, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000, unsigned char recursive=0) Line 524 + 0x25 bytes C++
***.exe!__CxxFrameHandler3(EHExceptionRecord * pExcept=0x062ad5fc, EHRegistrationNode * pRN=0x062aff48, void * pContext=0x062ad61c, void * pDC=0x062ad5d0) Line 365 + 0x1f bytes C++
ntdll.dll!ExecuteHandler2@20() + 0x26 bytes
ntdll.dll!ExecuteHandler@20() + 0x24 bytes
ntdll.dll!_KiUserExceptionDispatcher@8() + 0xe bytes
kernel32.dll!_RaiseException@16() + 0x52 bytes
09627080()

Re[7]: Exception from dll -> dll unload -> AV
От: Kh_Oleg  
Дата: 27.01.10 13:55
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Здравствуйте, ononim, Вы писали:


O>>Кроме того немного непонятно зачем делать проект состоящий из кучи разных длл, если условием нормальной работы которого является то, чтобы они были скомпилены все вместе одним компилятором и с одним и тем же набором разных либ, то есть фактически — чтоб это былоа единая компиляция. Не проще ли в таком случае сделать монолитный модуль, к чему эти длл?


B>dll к тому,что — это подключаемые модули, которые нет смысла отдавать статически влинкованными всем клиентам.

B>В качестве замены предлагается статичеки компилировать разные версии для разных клиентов?
Далеко не всякий подключаемый модуль позволяет себя выгружать. При использовании С++ через границу DLL возможность выгрузки стремится к нулю. Хорошим примером, когда система может выгружать плагины, является Far. Неслучайно поэтому весь Plugin API у него — на С.
Re[3]: Exception from dll -> dll unload -> AV
От: gear nuke  
Дата: 27.01.10 14:00
Оценка:
Здравствуйте, blackhearted,

Пока посмотрю колстек, но вот идея, мне кажется должно работать:
class Dummy
{
public:

    bool go(Library* lib)
    {
        std::cout<<"Dummy::go()"<<std::endl;
        std::exception const* pex = goimpl(lib);
        if ( pex )
        {
            std::cout<<"Rethrowing..."<<std::endl;
            std::exception ex(*pex);
            delete pex;
            throw ex;
        }
        return false;
    }

    std::exception const* goimpl(Library* lib)
    {
        std::cout<<"Dummy::go()"<<std::endl;
        try
        {
            lib->doAction();
        }
        catch(const std::exception& ex)
        {
            std::cout<<"Exception occured..."<<std::endl;
            std::cout<<ex.what()<<std::endl;
            loader.unload();
            std::exception const* ce = new std::exception(ex); // но нужно обезопаситься от bad_alloc
            return ce;
        }    
    }
};
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: Exception from dll -> dll unload -> AV
От: blackhearted Украина  
Дата: 27.01.10 14:01
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

K_O>Далеко не всякий подключаемый модуль позволяет себя выгружать. При использовании С++ через границу DLL возможность выгрузки стремится к нулю.


Даже если не бросаются исключения?
Как же все на плюсах пишут тогда приложения с плагинами?
Re[8]: Exception from dll -> dll unload -> AV
От: Тот кто сидит в пруду Россия  
Дата: 27.01.10 14:04
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Здравствуйте, Тот кто сидит в пруду, Вы писали:


ТКС>>Здравствуйте, blackhearted, Вы писали:


ТКС>>Так не бывает, в указанной строке нечему падать. Можно предположить, что на самом деле упало на call eax. eax чему равен — не 0x10004be0 (из первого сообщения) случаем? У lib __vptr или как его там не порушен ли уже?


B>Уже порушен — dll выгружена.


B>

B>_ZwRaiseException@12:
B>7C90D9AE mov eax,0B5h
B>7C90D9B3 mov edx,7FFE0300h
B>7C90D9B8 call dword ptr [edx]
B>7C90D9BA ret 0Ch


B>

B>EAX = 000000B5 EBX = 00000000 ECX = 00000206 EDX = 7FFE0300 ESI = 0012F5D4 EDI = 0012F5D4 EIP = 7C90D9B8 ESP = 0012F250 EBP = 0012F534 EFL = 00000206

B>7FFE0300 = 7C90E510



B>

B>_KiFastSystemCall@0:
B>7C90E510 mov edx,esp
B>7C90E512 sysenter

B>EAX = 000000B5 EBX = 00000000 ECX = 00000206 EDX = 0012F24C ESI = 0012F5D4 EDI = 0012F5D4 EIP = 7C90E512 ESP = 0012F24C EBP = 0012F534 EFL = 00000206


B>на sysenter падает


А это к чему вообще? Еще один кусочек стека?
И, падает оно явно не на sysenter: "Unhandled exception at 0x1024c61c (msvcr80d.dll)"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Exception from dll -> dll unload -> AV
От: Kh_Oleg  
Дата: 27.01.10 14:06
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Kh_Oleg, Вы писали:


K_O>>Угу. Позволю сделать предположение, что STL'ные классы не являются частью CRT, поэтому опция MD(d) — что мертвому припарка: таблица виртуальных методов std::exception, порожденной в DLL физически находится в этой (выгруженной) DLL, отсюда и свал при попытке обратиться к виртуальному методу. Правила работы с менеджером памяти (хотя и являются здравым советом) в данном конкретном случае ни при чем.


К>Посмотрел на определение std::exception — оно содержит __declspec(dllimport), во всяком случае, если компилировать с /MD(d).

К>Так что vtable должно жить в msvcrt(d).dll

__declspec(dllimport) всего лишь делает класс exception экспортируемым из DLL, т.е. видимым в таблице экспорта. Плюс шаманства с декорированием имен. И все.

Зато сам класс описан в заголовочном файле, а это значит, что копии описания такого класса (а конкретно — VMT) будут в каждом модуле (dll или exe), при компиляции которого был включен #include <exception>. В нашем случае — в exe и в dll. И у каждого модуля — своя копия VMT.

В данном случае идет попытка обратиться к той копии, которая выгружена благодаря FreeLibrary. Я вот только не пойму, зачем понадобилось выгружать. Очень не всегда это вообще возможно.
Re[4]: Exception from dll -> dll unload -> AV
От: Kh_Oleg  
Дата: 27.01.10 14:12
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, blackhearted,


GN>Пока посмотрю колстек, но вот идея, мне кажется должно работать:

GN>
GN>class Dummy
GN>{
GN>public:

GN>    bool go(Library* lib)
GN>    {
GN>        std::cout<<"Dummy::go()"<<std::endl;
GN>        std::exception const* pex = goimpl(lib);
GN>        if ( pex )
GN>        {
GN>            std::cout<<"Rethrowing..."<<std::endl;
GN>            std::exception ex(*pex);
GN>            delete pex;
GN>            throw ex;
GN>        }
GN>        return false;
GN>    }

GN>    std::exception const* goimpl(Library* lib)
GN>    {
GN>        std::cout<<"Dummy::go()"<<std::endl;
GN>        try
GN>        {
            lib->>doAction();
GN>        }
GN>        catch(const std::exception& ex)
GN>        {
GN>            std::cout<<"Exception occured..."<<std::endl;
GN>            std::cout<<ex.what()<<std::endl;
GN>            loader.unload();
GN>            std::exception const* ce = new std::exception(ex); // но нужно обезопаситься от bad_alloc
GN>            return ce;
GN>        }    
GN>    }
GN>};
GN>

GN> но нужно обезопаситься от bad_alloc
А также, проверить, чтобы конструктор не вызывал виртуальных методов у ex.
А конструктор, как оказывается, обращается к полю _m_what (напрямую), которое const char* и копирует его себе. Так что тут все будет зависеть от того, куда указывает строка в "выгруженной" exception.
Re[7]: Exception from dll -> dll unload -> AV
От: ononim  
Дата: 27.01.10 14:13
Оценка:
ТКС>На времени линковки можно сильно сэкономить, в случае разных dll.
И сильно потерять на времени загрузки приложения.
Как много веселых ребят, и все делают велосипед...
Re[9]: Exception from dll -> dll unload -> AV
От: Kh_Oleg  
Дата: 27.01.10 14:13
Оценка: 1 (1)
Здравствуйте, blackhearted, Вы писали:

B>Здравствуйте, Kh_Oleg, Вы писали:


K_O>>Далеко не всякий подключаемый модуль позволяет себя выгружать. При использовании С++ через границу DLL возможность выгрузки стремится к нулю.


B>Даже если не бросаются исключения?

B>Как же все на плюсах пишут тогда приложения с плагинами?
А ты покажи мне стабильное приложение с плагинами на плюсах. Я таких не знаю. Far — написан на С++ и работает с плагинами, НО: интерфейс к плагинам у него — чистый С.
Re[3]: Exception from dll -> dll unload -> AV
От: gear nuke  
Дата: 27.01.10 14:15
Оценка: 2 (1)
Здравствуйте, blackhearted, Вы писали:

B>
B>try {        
B>    component->init();
B>  } catch (const Exception& ex) {
    log->>fatal("failed to initialize: " 
B>      + ex.what());
B>    component->detach();
B>    component->shutdown();// тут уходит в другой поток, который делает FreeLibrary    
B>    throw;
B>  }
B>


Так, тут картина довольно запутанная, но впринципе тоже самое, что и раньше. Дучаю, что другой тред выгруджает длл раньше чем завершаться раскрутка throw;. AV в FindHandler нет, потому что по-видимому в приложении установлен SE translator, вот он и пытается транслировать исключение и валится на внутреннем assert
B>

B>***.exe!_NMSG_WRITE(int rterrnum=10) Line 198 C
B>***.exe!abort() Line 59 + 0x7 bytes C
B>***.exe!_wassert(const wchar_t * expr=0x04e33520, const wchar_t * filename=0x04e334e0, unsigned int lineno=448) Line 212 C
B>***.exe!`anonymous namespace'::trans_func(unsigned int u=3221225477, _EXCEPTION_POINTERS * ptr=0x062acf4c) Line 448 + 0x18 bytes C++
B>***.exe!_CallSETranslator(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, void * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 701 + 0xd bytes C++
B>***.exe!FindHandlerForForeignException(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, _CONTEXT * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, int curState=0, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 934 + 0x21 bytes C++
B>***.exe!FindHandler(EHExceptionRecord * pExcept=0x062ad178, EHRegistrationNode * pRN=0x062af59c, _CONTEXT * pContext=0x062ad194, void * pDC=0x062ad14c, const _s_FuncInfo * pFuncInfo=0x05444634, unsigned char recursive=0, int CatchDepth=0, EHRegistrationNode * pMarkerRN=0x00000000) Line 866 + 0x25 bytes C++

.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Exception from dll -> dll unload -> AV
От: gear nuke  
Дата: 27.01.10 14:17
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

K_O>А также, проверить, чтобы конструктор не вызывал виртуальных методов у ex.

K_O>А конструктор, как оказывается, обращается к полю _m_what (напрямую), которое const char* и копирует его себе. Так что тут все будет зависеть от того, куда указывает строка в "выгруженной" exception.

Значит выгружать после копирования, писал, а потом думал

Основная идея в том, что падение происходит внутри диспетчера исключений. Поэтому нужно что бы он спокойно сделал раскрутку, а только потом выгружать dll.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[10]: Exception from dll -> dll unload -> AV
От: blackhearted Украина  
Дата: 27.01.10 14:20
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

K_O>Здравствуйте, blackhearted, Вы писали:


B>>Здравствуйте, Kh_Oleg, Вы писали:


K_O>>>Далеко не всякий подключаемый модуль позволяет себя выгружать. При использовании С++ через границу DLL возможность выгрузки стремится к нулю.


B>>Даже если не бросаются исключения?

B>>Как же все на плюсах пишут тогда приложения с плагинами?
K_O>А ты покажи мне стабильное приложение с плагинами на плюсах. Я таких не знаю. Far — написан на С++ и работает с плагинами, НО: интерфейс к плагинам у него — чистый С.

Суть поста понятна — все стремятся к идеалу,которым является FAR.
Но вопрос был не про стабильность приложения на плюсах, а про проброс исключений из dll и её последующей выгрузкой.
Приложение,в котором это всё происходит — стабильно и этот AV нормально ловится и корректно обрабатывается.
Re[7]: Exception from dll -> dll unload -> AV
От: Кодт Россия  
Дата: 27.01.10 14:23
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:

К>>Посмотрел на определение std::exception — оно содержит __declspec(dllimport), во всяком случае, если компилировать с /MD(d).

К>>Так что vtable должно жить в msvcrt(d).dll

K_O>__declspec(dllimport) всего лишь делает класс exception экспортируемым из DLL, т.е. видимым в таблице экспорта. Плюс шаманства с декорированием имен. И все.


Не экспортируемым, а импортируемым. А экспортируется этот класс из msvcrt.dll.
В таблице экспорта оказываются и имена функций, и vtable этого класса, тут всё честно должно быть.

Но чтобы убрать сомнения, нужно сделать dumpbin /imports у dll и exe.
Перекуём баги на фичи!
Re[8]: Exception from dll -> dll unload -> AV
От: Тот кто сидит в пруду Россия  
Дата: 27.01.10 14:28
Оценка: 1 (1)
Здравствуйте, ononim, Вы писали:

ТКС>>На времени линковки можно сильно сэкономить, в случае разных dll.

O>И сильно потерять на времени загрузки приложения.

Да пофиг. У нас суммарное время линковки всех модулей текущего проекта минут сорок, не меньше. Даже если допустить, что оно не возрастет после слияния их в монолитные exe (а оно возрастет, и сильно), это уже вызовет такие потери на простои программистов, что контору сразу можно будет закрывать, штоп не мучалась.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: Exception from dll -> dll unload -> AV
От: blackhearted Украина  
Дата: 27.01.10 14:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Не экспортируемым, а импортируемым. А экспортируется этот класс из msvcrt.dll.

К>В таблице экспорта оказываются и имена функций, и vtable этого класса, тут всё честно должно быть.

К>Но чтобы убрать сомнения, нужно сделать dumpbin /imports у dll и exe.




Dump of file Application.exe

File Type: EXECUTABLE IMAGE

Section contains the following imports:

KERNEL32.dll
41C274 Import Address Table
41C050 Import Name Table
0 time date stamp
0 Index of first forwarder reference

F8 FreeLibrary
1A0 GetProcAddress
171 GetLastError
252 LoadLibraryA
17E GetModuleFileNameW
1A3 GetProcessHeap
210 HeapAlloc
216 HeapFree
1CA GetSystemTimeAsFileTime
143 GetCurrentProcessId
146 GetCurrentThreadId
1DF GetTickCount
2A3 QueryPerformanceCounter
3CC lstrlenA
275 MultiByteToWideChar
394 WideCharToMultiByte
78 DebugBreak
2A7 RaiseException
239 IsDebuggerPresent
34A SetUnhandledExceptionFilter
36E UnhandledExceptionFilter
142 GetCurrentProcess
35E TerminateProcess
226 InterlockedCompareExchange
356 Sleep
229 InterlockedExchange
388 VirtualQuery

MSVCR80D.dll
41C3BC Import Address Table
41C198 Import Name Table
0 time date stamp
0 Index of first forwarder reference

75 _CrtSetCheckCount
1B0 _except_handler4_common
19C _decode_pointer
365 _onexit
2BC _lock
BD __dllonexit
432 _unlock
251 _invoke_watson
178 _controlfp_s
39 ?_type_info_dtor_internal_method@type_info@@QAEXXZ
47 ?terminate@@YAXXZ
187 _crt_debugger_hook
24C _initterm_e
24B _initterm
C7 __initenv
521 exit
163 _cexit
8D _XcptFilter
1B9 _exit
C6 __getmainargs
14C _amsg_exit
10F __set_app_type
1A7 _encode_pointer
F9 __p__fmode
F2 __p__commode
13A _adjust_fdiv
112 __setusermatherr
175 _configthreadlocale
13 ??3@YAXPAX@Z
5F _CRT_RTC_INITW
9 ??0exception@std@@QAE@ABQBDH@Z
7F _CxxThrowException
4A ?what@exception@std@@UBEPBDXZ
A ??0exception@std@@QAE@ABV01@@Z
F ??1exception@std@@UAE@XZ
9A __CxxFrameHandler3
64 _CrtDbgReportW

MSVCP80D.dll
41C320 Import Address Table
41C0FC Import Name Table
0 time date stamp
0 Index of first forwarder reference

952 ?good@ios_base@std@@QBE_NXZ
1A0 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z
6D3 ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ
2B4 ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ
65A ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ
5D2 ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ
CD3 ?uncaught_exception@std@@YA_NXZ
5FF ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ
853 ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z
CAC ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ
8E8 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ
A2B ?length@?$char_traits@D@std@@SAIPBD@Z
CF7 ?width@ios_base@std@@QBEHXZ
8E7 ?flags@ios_base@std@@QBEHXZ
381 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z
72A ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
88E ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ
C30 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z
CF6 ?width@ios_base@std@@QAEHH@Z
C63 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z
873 ?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z
859 ?eof@?$char_traits@D@std@@SAHXZ
C60 ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z
B6F ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ

Summary

1000 .data
2000 .idata
3000 .rdata
1000 .rsrc
7000 .text
10000 .textbss



Dump of file Library.dll

File Type: DLL

Section contains the following imports:

MSVCR80D.dll
100040CC Import Address Table
10004F08 Import Name Table
0 time date stamp
0 Index of first forwarder reference

1B0 _except_handler4_common
365 _onexit
2BC _lock
BD __dllonexit
432 _unlock
B3 __clean_type_info_names_internal
39 ?_type_info_dtor_internal_method@type_info@@QAEXXZ
47 ?terminate@@YAXXZ
187 _crt_debugger_hook
91 __CppXcptFilter
13A _adjust_fdiv
14C _amsg_exit
24C _initterm_e
24B _initterm
75 _CrtSetCheckCount
19C _decode_pointer
1A8 _encoded_null
1E3 _free_dbg
2CE _malloc_dbg
1A7 _encode_pointer
5F _CRT_RTC_INITW
11 ??2@YAPAXI@Z
473 _wassert
13 ??3@YAXPAX@Z
A ??0exception@std@@QAE@ABV01@@Z
F ??1exception@std@@UAE@XZ
7F _CxxThrowException
B ??0exception@std@@QAE@XZ
9A __CxxFrameHandler3

MSVCP80D.dll
1000406C Import Address Table
10004EA8 Import Name Table
0 time date stamp
0 Index of first forwarder reference

65A ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ
5D2 ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ
2B4 ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ
381 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z
72A ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
853 ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z
1A0 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z
C30 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z
CF6 ?width@ios_base@std@@QAEHH@Z
C63 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z
873 ?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z
859 ?eof@?$char_traits@D@std@@SAHXZ
C60 ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z
B6F ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ
88E ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ
8E7 ?flags@ios_base@std@@QBEHXZ
CF7 ?width@ios_base@std@@QBEHXZ
A2B ?length@?$char_traits@D@std@@SAIPBD@Z
8E8 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ
CAC ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ
952 ?good@ios_base@std@@QBE_NXZ
5FF ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ
CD3 ?uncaught_exception@std@@YA_NXZ

KERNEL32.dll
10004000 Import Address Table
10004E3C Import Name Table
0 time date stamp
0 Index of first forwarder reference

F8 FreeLibrary
388 VirtualQuery
17E GetModuleFileNameW
1A3 GetProcessHeap
210 HeapAlloc
216 HeapFree
1CA GetSystemTimeAsFileTime
143 GetCurrentProcessId
146 GetCurrentThreadId
1DF GetTickCount
2A3 QueryPerformanceCounter
252 LoadLibraryA
1A0 GetProcAddress
3CC lstrlenA
275 MultiByteToWideChar
394 WideCharToMultiByte
78 DebugBreak
2A7 RaiseException
239 IsDebuggerPresent
34A SetUnhandledExceptionFilter
36E UnhandledExceptionFilter
142 GetCurrentProcess
35E TerminateProcess
226 InterlockedCompareExchange
356 Sleep
229 InterlockedExchange

Summary

1000 .data
2000 .rdata
1000 .reloc
1000 .rsrc
3000 .text

Re[11]: Exception from dll -> dll unload -> AV
От: Kh_Oleg  
Дата: 27.01.10 14:43
Оценка:
B>Суть поста понятна — все стремятся к идеалу,которым является FAR.
B>Но вопрос был не про стабильность приложения на плюсах, а про проброс исключений из dll и её последующей выгрузкой.
B>Приложение,в котором это всё происходит — стабильно и этот AV нормально ловится и корректно обрабатывается.

Суть прошлого сообщения — не все можно выгружать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.