2012-10-22 17 views
5

Ho installato GDB 7.5 nella mia macchina. Sembra pretty-stampanti per STL già viene fornito in bundle con questa versione, dal momento che in esecuzione:Stampa graziosa STL con GDB e Clang

(gdb) info pretty-printers 

stampa una lunga lista di tutte le stampanti STL disponibili.

Il debug di un codice C++ che è stato compilato con g ++ ottiene il comportamento corretto della stampa carina. Tuttavia, lo stesso non è osservato se lo stesso codice è compilato con clang ++.

Di seguito è un output quando run gdb:

BFD: /usr/lib/libstdc++.6.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/libstdc++.6.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/libSystem.B.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/libSystem.B.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/libc++abi.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/libc++abi.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libcache.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libcache.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libcommonCrypto.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libcommonCrypto.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libcompiler_rt.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libcompiler_rt.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libcopyfile.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libcopyfile.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libdispatch.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libdispatch.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libdnsinfo.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libdnsinfo.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libdyld.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libdyld.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libkeymgr.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libkeymgr.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/liblaunch.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/liblaunch.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libmacho.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libmacho.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libquarantine.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libquarantine.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libremovefile.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libremovefile.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_blocks.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_blocks.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_c.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_c.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_dnssd.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_dnssd.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_info.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_info.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_kernel.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_kernel.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_m.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_m.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_network.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_network.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_notify.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_notify.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libsystem_sandbox.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libsystem_sandbox.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libunc.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libunc.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libunwind.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libunwind.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libxpc.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libxpc.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/system/libcorecrypto.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/system/libcorecrypto.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/libobjc.A.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/libobjc.A.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/libauto.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/libauto.dylib(i386:x86-64): unknown load command 0x2b 
BFD: /usr/lib/libc++.1.dylib(i386:x86-64): unknown load command 0x2a 
BFD: /usr/lib/libc++.1.dylib(i386:x86-64): unknown load command 0x2b 

Vorrei sapere come posso ottenere contenitori STL pretty-stampati quando il codice è stato compilato con clangore ++? Nota che posso eseguire il debug dell'applicazione; Non riesco proprio a stampare i contenuti STL.

risposta

4

Il gdb in uso ha un elenco di numeri di comando di caricamento Mach-O noti, ma due nuovi sono stati aggiunti in Mac OS X 10.8 (LC_SOURCE_VERSION, 0x2a e LC_DYLIB_CODE_SIGN_DRS, 0x2b) e si lamenta che non sapere di questi. Non ha bisogno di sapere su questi, non c'è nulla di necessario per il debugger in questi comandi di caricamento. Gli avvertimenti dovrebbero essere innocui.

È molto meglio usare il gdb fornito da Apple (che non ha il supporto per Python, lo so) o il nuovo debugger supportato da Apple, LLDB. lldb è un nuovo debugger molto interessante che sta migliorando rapidamente, Apple lo ha sviluppato da zero (sfruttando l'infrastruttura e le funzionalità di llvm il più possibile) negli ultimi anni ed è abbastanza capace oggi. È stato progettato fin dall'inizio per essere estendibile tramite Python ed è facile creare nuovi formattatori di dati per i tipi di container che potresti incontrare.

Se non avete usato lldb prima, ma hanno familiarità con gdb, un foglietto utile è la pagina di equivalenze comando sopra a http://lldb.llvm.org/lldb-gdb.html

Dare lldb una prova. È il futuro del debug supportato su Mac OS X - c'è molto da apprezzare oggi e sta migliorando ogni release. È anche open source, puoi verificarlo dal http://lldb.llvm.org/ e giocare da solo.