Il semble qu'il ya deux façons pour Mac OS X pour placer des informations de débogage:
Dans les fichiers objets .o
utilisés pour la compilation. Le binaire stocke une référence à ces fichiers (par chemin absolu).
Dans un paquet séparé (répertoire) appelé .dSYM
Si je compile avec Clang d'Apple en utilisant g++ -g main.cpp -o foo
je reçois le paquet appelé foo.dSYM
. Cependant, si j'utilise CMake, j'obtiens les informations de débogage dans les fichiers objets. Je suppose que parce qu'il fait une étape distincte gcc -c main.cpp -o main.o
?
Quoi qu'il en soit, je trouve cette commande très utile pour le cas 1:
$ dsymutil -dump-debug-map main
---
triple: 'x86_64-apple-darwin'
binary-path: main
objects:
- filename: /Users/tim/foo/build/CMakeFiles/main.dir/main.cpp.o
timestamp: 1485951213
symbols:
- { sym: __ZNSt3__111char_traitsIcE11eq_int_typeEii, objAddr: 0x0000000000000D50, binAddr: 0x0000000100001C90, size: 0x00000020 }
- { sym: __ZNSt3__111char_traitsIcE6lengthEPKc, objAddr: 0x0000000000000660, binAddr: 0x00000001000015A0, size: 0x00000020 }
- { sym: GCC_except_table3, objAddr: 0x0000000000000DBC, binAddr: 0x0000000100001E2C, size: 0x00000000 }
- { sym: _main, objAddr: 0x0000000000000000, binAddr: 0x0000000100000F40, size: 0x00000090 }
- { sym: __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m, objAddr: 0x00000000000001F0, binAddr: 0x0000000100001130, size: 0x00000470 }
- { sym: ___clang_call_terminate, objAddr: 0x0000000000000D40, binAddr: 0x0000000100001C80, size: 0x00000010 }
- { sym: GCC_except_table5, objAddr: 0x0000000000000E6C, binAddr: 0x0000000100001EDC, size: 0x00000000 }
- { sym: __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_, objAddr: 0x0000000000000680, binAddr: 0x00000001000015C0, size: 0x000006C0 }
- { sym: __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_, objAddr: 0x00000000000000E0, binAddr: 0x0000000100001020, size: 0x00000110 }
- { sym: GCC_except_table2, objAddr: 0x0000000000000D7C, binAddr: 0x0000000100001DEC, size: 0x00000000 }
- { sym: __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc, objAddr: 0x0000000000000090, binAddr: 0x0000000100000FD0, size: 0x00000050 }
- { sym: __ZNSt3__111char_traitsIcE3eofEv, objAddr: 0x0000000000000D70, binAddr: 0x0000000100001CB0, size: 0x0000000B }
...
Comment 'dsymutil' sait-il où sont les fichiers .o? Je ne vois aucune option dans la page de manuel pour le dire. Aussi ai-je besoin de compiler le binaire '-g3', et si oui, puis-je le supprimer après l'avoir' dsymutil''d? Merci. – mxcl
Il existe des entrées "debug map" dans l'exécutable avant qu'il ne soit supprimé avec les noms de fichier des fichiers .o. 'nm -pa binaire | grep OSO' les liste. Ils sont sous la forme de l'ancien format debab de stabs (parce que l'éditeur de liens savait déjà comment gérer ce format). Après avoir créé votre dSYM, vous pouvez les supprimer de l'exécutable. Vous ne devriez pas avoir besoin d'utiliser '-g3' sur la plate-forme Mac,' -g' devrait suffire. Je pense que '-g3' sort des informations de macro de preprocess mais lldb ne les lit pas sur Mac OS X (et je ne sais pas si clang les sort même.) –
Merci pour cette réponse détaillée et utile. – mxcl