Ich habe die folgende "First-Chance-Ausnahme" Nachricht, die von einer DLL kommt, die ich geschrieben habe, die in einer ausführbaren Datei läuft, die ich nicht geschrieben habe. Das heißt, die DLL ist ein Plugin. Wenn diese Ausnahme zum ersten Mal ausgelöst wird, schlägt ein Versuch fehl, eine Shared Memory-Map-Datei zu öffnen. Wenn ich Ausnahmen der ersten Chance ignoriere und einfach laufe, erstarrt die Anwendung oder stürzt schließlich ab.Wie kann ich das Problem der Endlosschleife und Heap-Beschädigung beheben oder beheben, das boost :: interprocess managed_shared_memory betrifft?
First-chance exception at 0x76a7c41f in notmyexe.exe: Microsoft C++ exception: boost::interprocess::interprocess_exception at memory location 0x002bc644..
Nach mehreren Stunden wird es durch einen Block des Codes verursacht werden, die endlos ist, Looping, bis eine erwartete löscht Ausnahmebedingung. Es stellt sich heraus, dass, wenn es nie klar wird, und dann diese Exception schließlich in eine andere Low-Level-Exception-Bedingung und/oder in Heap-Korruption verwandelt wird. All dies ist nur in dem Bemühen, einen gemeinsamen Speicherbereich mit Boost :: Interprocess zu öffnen. Die erste Sache, die Dinge verkompliziert, ist, dass auf meinem Visual C++ 2008-basierten Projekt die erste boost::interprocess::interprocess_exception
First-Chance-Ausnahme nicht ausgelöst und als Speicherort identifiziert wird, da der Visual C++ 2008-Compiler den komplexen Boost nicht finden kann - Flavour Templates Code in Frage. Durch das schrittweise Durchlaufen der Assembly Language View habe ich jedoch den Code gefunden, der explodiert.
Die Top-Level-Linie meines eigenen Code, der es auf zu gehen schlecht beginnt, ist:
segment = new managed_shared_memory( open_or_create
, MEMORY_AREA_NAME
, SHARED_AREA_SIZE);
Die obige managed_shared_memory
Klasse von interprocess_fwd.hpp ist, und ist zu einem festen Bestandteil des Boost-Shared-Memory-API/Kopfzeilen. Da es auf einer Vorlage basiert, erweitert sich das Obige in einen etwa 2Kchars langen C++ - Boost-Vorlagenausdruck, der vom Linker und vom Debugger auf unterschiedliche Länge gekürzt wird. Visual C++ 2008 hat keine Quellcode-Debugging-Funktionen mehr, scheint es, wenn diese Grenzen im Spiel sind.
Zum Beispiel, wenn es explodiert Ich erhalte diesen Call-Stack:
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()
Keine tatsächlichen Endbenutzer Funktionen geschrieben Quelle in dem Stapel erscheinen oben Dump.
Wie soll ich das debuggen? Zweitens, gibt es ein bekanntes Problem mit boost-interprocess, mit Visual C++ 2008? Drittens, was ist der Boost-Code unten und warum muss er endlos loopen?
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...
weitere Schichten nach unten, wir bekommen zu:
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)
{}
Anyways, versuchen Sie nicht, diese Kinder zu Hause zu debuggen, hier ist was passiert:
Schließlich Mit meiner Ninja-ähnlichen Fähigkeit, einzelne Millionen Zeilen Assemblersprache zu durchlaufen, habe ich die bösen Debugger-Einschränkungen von Visual C++ 2008 besiegt und den Code in qu gefunden estion.
Dies ist, was in der Tat sprengt: create_device<FileBased>(dev...
.
Einige Kontext hier: managed_open_or_create_impl.h Linie 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 für das freihändige mürrische Gesicht. –
Es gibt eine Menge zu absorbieren, aber haben Sie die Möglichkeit in Betracht gezogen, dass eine Ausnahme der ersten Chance vollständig gutartig sein kann? –
Ich habe einige Bearbeitungen vorgenommen und einige sehr unprofessionelle Sachen in dieser Frage entfernt. Ich entschuldige mich für jeden, der die Originalversion lesen musste. –