Ho una grande app Mac che funziona per un paio di giorni alla volta su un grande set di dati. È un mix di Objective-C++ e C++. Funziona alla grande su Mountain Lion, ma su Mavericks, dopo aver corso per circa 10 o 20 minuti (in cui un paio di milioni di oggetti sono assegnati e distrutti), si blocca. Si comporta come se si bloccasse con un puntatore non valido (ad esempio chiamando una funzione su un oggetto C++ cancellato), ma l'oggetto a cui punta è in uno stato che non ha assolutamente senso.Arresto anomalo di C++ e Objective-C++ su Mavericks
Tutte le mie classi C++ ereditare da una classe base comune in cui il costruttore simile a questa:
MyClass::MyClass()
{
mCreated = 12345; //int member variable set here and NEVER TOUCHED AGAIN.
//other initialization stuff
}
Quando si blocca, il debugger mostra che nell'oggetto male, il valore per mCreated
è 0. E ' comportandosi come se l'oggetto non avesse mai eseguito il suo costruttore!
Non penso che stomping della memoria, perché questo valore non è mai diverso da 0 o il valore previsto, e nessuno degli altri campi nell'oggetto ha valori che assomigliano alla spazzatura che ci si aspetterebbe dalla memoria stomping .
Ho anche provato a scattare con lo scarabocchio attivato e i valori 0x555
e 0xaaa
non vengono visualizzati da nessuna parte. Ho anche provato i bordi di guardia.
L'indagine approfondita non ha rivelato nulla. L'oggetto cattivo non è nemmeno sempre la stessa classe. Tutto quello che riesco a pensare è che qualcosa con la nuova memoria in Mavericks (comprimere memoria inutilizzata) sta causando qualche nuovo comportamento (forse un bug o forse qualche regola precedentemente sconosciuta, per lo più non applicata che ora conta davvero).
Qualcuno ha visto qualcosa di simile? O qualcuno sa di regole di memoria per lo più sconosciute che si applicherebbero più fortemente sotto Mavericks?
recentemente imparato ** molto utile ** tecnica di debug (quindi mi sento meglio condividerla): GDB (e sicuramente LLDB) può guardare gli indirizzi di memoria da leggere/scrivere su. Non ricordo il comando esatto, ma lo troverai sicuramente, cerca "gdb watch memory access". –
aw wait, no, [eccolo qui] (http: // stackoverflow.com/domande/58851/can-i-set-a-punto di interruzione-on-memory-access-in-gdb/59146 # 59146). –
@ H2CO3 - Buono a sapersi, ma non c'è modo di sapere quale indirizzo sarà soffocato. –