필자가 작성하지 않은 실행 파일에서 실행중인 쓴 DLL에서 오는 "첫 번째 예외 예외"메시지가 있습니다. 즉, DLL은 플러그인입니다. 이 예외가 처음으로 발생하면 공유 메모리 맵 파일 열기 시도가 실패합니다. 첫 번째 예외를 무시하고 그냥 실행하면 결국 응용 프로그램이 멈추거나 충돌합니다. 몇 시간 후boost :: interprocess managed_shared_memory가 관련된 무한 루프 및 힙 손상 문제를 디버그하거나 수정하려면 어떻게합니까?
First-chance exception at 0x76a7c41f in notmyexe.exe: Microsoft C++ exception: boost::interprocess::interprocess_exception at memory location 0x002bc644..
예상 예외 조건이 클리어 될 때까지 끝없이 반복되는 코드 블록에 의한 것으로 보인다. 분명히 밝혀지지 않으면 궁극적으로이 예외는 다른 저수준 예외 상황으로 바뀌거나 힙 손상으로 바뀝니다. 이 모든 것은 단지 Boost :: interprocess를 사용하여 공유 메모리 영역을 여는 데있다. 일을 복잡하게
우선 내 비주얼 C++ 2008 기반 프로젝트에 첫 번째 boost::interprocess::interprocess_exception
첫 번째 예외가 발생되지 않고는 비주얼 C++ 2008 컴파일러는 복잡한 향상을 찾을 수 없기 때문에 온 위치로 확인한다는 것입니다 문제의 템플릿 코드를 맛보기. 그러나 어셈블리 언어 뷰를 한 단계 씩 진행하면 코드가 폭발적으로 증가합니다.
segment = new managed_shared_memory( open_or_create
, MEMORY_AREA_NAME
, SHARED_AREA_SIZE);
위 managed_shared_memory
클래스는 interprocess_fwd.hpp에서, 그리고 부스트 공유 메모리 API의 표준 일부입니다
모든이에 나쁜 이동하기 시작 내 자신의 코드의 최상위 라인입니다/헤더. 템플릿 기반이기 때문에 위의 내용은 링커 및 디버거가 서로 다른 길이로 잘린 약 2Kchars 길이의 C++ 부스트 템플릿 표현식으로 확장됩니다. Visual C++ 2008에는 더 이상의 소스 코드 디버깅 기능이 없습니다. 이러한 제한이 작용할 때 나타납니다. 로 작성된 소스 기능을 스택에 표시
KernelBase.dll!76a7c41f()
[Frames below may be incorrect and/or missing, no symbols loaded for KernelBase.dll]
KernelBase.dll!76a7c41f()
> msvcr90d.dll!_malloc_dbg(unsigned int nSize=2290875461, int nBlockUse=264, const char * szFileName=0x01fcb983, int nLine=1962999808) Line 160 + 0x1b bytes C++
8bfc4d89()
실제 최종 사용자가 위의 덤프 없습니다 : 그것은 불면 때
예를 들어는,이 호출 스택을 얻을.
어떻게 디버깅해야합니까? 둘째, Visual C++ 2008과 함께 boost-interprocess와 관련하여 알려진 문제점이 있습니까? 셋째, 아래의 부스트 코드는 무엇이며 끝없이 반복해야하는 이유는 무엇입니까? 여기 무슨 일이야, 집에 애들이 디버깅하려고하지 않는, 어쨌든
basic_managed_shared_memory (open_or_create_t,
const char *name, size_type size,
const void *addr = 0, const permissions& perm = permissions())
: base_t()
, base2_t(open_or_create, name, size, read_write, addr,
create_open_func_t(get_this_pointer(),
ipcdetail::DoOpenOrCreate), perm)
{}
: 아래
boost::interprocess::basic_managed_shared_memory<char,
boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family,
boost::interprocess::offset_ptr<void,int,unsigned int,0>,0>,
boost::interprocess::iset_index>::basic_managed_shared_memory<char,boo...
또한 층은, 우리가 얻을
마지막으로
, 수백만 줄의 어셈블리 언어를 통해 한 단계 씩 수행 할 수있는 닌자 같은 기능을 사용하여 Visual C++ 2008의 사악한 디버거 제한을 깨고 코드를 발견했습니다. estion.
이것은 실제로 불고 있습니다 : create_device<FileBased>(dev...
.
여기에 몇 가지 상황 : managed_open_or_create_impl.h 라인 (351) ...
else if(type == DoOpenOrCreate){
//This loop is very ugly, but brute force is sometimes better
//than diplomacy. If someone knows how to open or create a
//file and know if we have really created it or just open it
//drop me a e-mail!
bool completed = false;
while(!completed){
try{
create_device<FileBased>(dev, id, size, perm, file_like_t()); // <-- KABOOM!
created = true;
completed = true;
}
catch(interprocess_exception &ex){
if(ex.get_error_code() != already_exists_error){
throw;
}
else{
try{
DeviceAbstraction tmp(open_only, id, read_write);
dev.swap(tmp);
created = false;
completed = true;
}
catch(interprocess_exception &e){
if(e.get_error_code() != not_found_error){
throw;
}
}
catch(...){
throw;
}
}
}
catch(...){
throw;
}
thread_yield();
}
}
자유로운 심술 얼굴에 +1. –
여기에 흡수해야 할 것이 많지만, First-Chance 예외가 완전히 해롭다는 가능성을 고려 했습니까? –
나는 약간의 편집을했고이 질문에서 매우 전문적이지 않은 것들을 제거했다. 나는 원래 버전을 읽어야했던 누구에게나 사과합니다. –