Ho il seguente messaggio di "prima eccezione possibilità" che proviene da una DLL che ho scritto che è in esecuzione in un eseguibile che non ho scritto. Cioè, la DLL è un plugin. La prima volta che si attiva questa eccezione, un tentativo di aprire un file della mappa di memoria condivisa non funziona. Se ignoro le eccezioni di prima scelta e semplicemente eseguo, l'applicazione si blocca o si blocca alla fine.Come faccio a eseguire il debug o correggere il problema del loop infinito e dell'heap heap che coinvolge boost :: interprocess managed_shared_memory?
First-chance exception at 0x76a7c41f in notmyexe.exe: Microsoft C++ exception: boost::interprocess::interprocess_exception at memory location 0x002bc644..
Dopo diverse ore sembra essere causato da un blocco di codice che è un loop all'infinito finché una condizione di eccezione previsto libera. Si scopre che se non si cancella mai, e quindi, alla fine, questa eccezione si trasforma in un'altra condizione di eccezione di basso livello e/o si trasforma in danneggiamento dell'heap. Tutto questo è solo nel tentativo di aprire un'area di memoria condivisa usando Interprocess.
La prima cosa che complica le cose è che sul mio ++ progetto di Visual C 2008 sulla base, la prima eccezione boost::interprocess::interprocess_exception
first-chance non è gettato e identificato come il luogo da dove è venuto, perché il Visual C++ 2008 compilatore non riesce a trovare il complesso spinta -file codice template in questione. Comunque, passando per la vista del linguaggio di assemblaggio, ho trovato il codice che esplode.
La linea di livello superiore del mio codice che tutto comincia ad andare male in è:
segment = new managed_shared_memory( open_or_create
, MEMORY_AREA_NAME
, SHARED_AREA_SIZE);
È possibile che questo managed_shared_memory
classe è da interprocess_fwd.hpp, ed è una parte standard della spinta condivisa API di memoria/intestazioni. Poiché è basato su template, il precedente si espande in un'espressione di modello di boost C++ lungo 2Kchars, che viene troncato a diverse lunghezze dal linker e dal debugger. Visual C++ 2008 non ha più capacità di debug del codice sorgente, sembra quando questi limiti sono in gioco.
Ad esempio, quando si fa saltare in aria ottengo questo stack di chiamate:
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()
No effettiva dell'utente finale funzioni sorgenti scritti appaiono nello stack di discarica di cui sopra.
Come si esegue il debug di questo? In secondo luogo, c'è qualche problema noto con boost-interprocess, con Visual C++ 2008? In terzo luogo, che cosa fa il codice di boost qui sotto e perché deve essere ripetuto all'infinito?
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...
ulteriori strati verso il basso, si arriva a:
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)
{}
In ogni modo, non cercare di eseguire il debug di questo a casa i bambini, ecco cosa succede:
Infine, usando la mia capacità di tipo ninja per un singolo passaggio attraverso diverse milioni di righe di linguaggio assembly ho sconfitto le deboli limitazioni del debugger di Visual C++ 2008 e ho trovato il codice in qu estion.
Questo è ciò che sta esplodendo, infatti: create_device<FileBased>(dev...
.
Alcuni contesto qui: managed_open_or_create_impl.h linea 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 per la faccia scontrosa a mano libera. –
Qui c'è molto da assorbire, ma hai considerato la possibilità che un'eccezione First-Chance possa essere completamente positiva? –
Ho apportato alcune modifiche e rimosso ciò che era un aspetto non professionale in questa domanda. Mi scuso per chiunque abbia dovuto leggere la versione originale. –