Option "Detaillierte Segmentzuordnung"
Nach oben zu Befehlszeilenhilfsprogramme - Index
Inhaltsverzeichnis |
Map-Dateien
Map-Dateien sind reine, vom Linker erzeugte Textdateien, die Informationen über die globalen Symbole, Quelldateien und Quellzeilennummern eines Programms enthalten, die beim Debuggen hilfreich sind.
Der Linker erzeugt standardmäßig eine Map-Datei mit den folgenden allgemeinen Segmentinformationen:
- Eine Liste der Segmente mit ihren Namen
- Die Programmstartadresse und das Offset
- Die Klasse:
- CODE (enthält ausführbare Anweisungen)
- DATA (enthält die globalen und statischen Variablen, die vom Programmierer initialisiert wurden)
- BSS (enthält statisch zugewiesene Variablen) oder
- TLS (Thread-lokaler Speicher)
- Warn- und Fehlermeldungen, die während des Linkens erzeugt wurden
//hello.cpp #include<iostream> #include<string> int main(int, char**) { std::string s("hello world"); std::cout<<s; return 0; }
Die für das vorherige Codebeispiel erstellte Map-Datei sieht beispielsweise nach dem Linken der .cpp-Datei folgendermaßen aus:
Start Length Name Class 0001:00401000 0000214D4H _TEXT CODE 0002:00423000 0000059B8H _DATA DATA 0003:004289B8 000002F24H _BSS BSS 0004:00000000 00000009CH _TLS TLS
Bei einem Aufruf von BCC32 mit der Option -M enthält die Map-Datei außer den Standardinformationen die folgenden beiden Abschnitte:
Address Publics by Name 0002:000024C4 @std@%basic_filebuf$b19std@%char_traits$b%%@3 0002:000010E8 @std@%basic_filebuf$c19std@%char_traits$c%%@3 0002:00002450 @std@%basic_ios$b19std@%char_traits$b%%@3 . . . Address Publics by Value 0001:000000E4 _main 0001:00000730 std::allocator<char>::allocator<char>() . . .
Der Abschnitt Address Publics by Name enthält Paare von Startadressen (Segment:Offset) und Methoden, Variablen oder andere Symbole. Diese Paare sind nach Symbolnamen sortiert. Der Abschnitt Address Publics by Value enthält dieselben Paare wie der Abschnitt Address Publics by Name, aber nach Werten sortiert.
Option "Detaillierte Segmentzuordnung"
Die Option Detaillierte Segmente von ILINK32 (/s) und von BCC32 (-ls) erzeugt die umfangreichste Map-Datei durch Hinzufügen einer detaillierten Auflistung der Segmente zu der Map-Datei, die in der Regel mit der Option Publics (/M) erstellt wurde.
Die Map-Datei für den vorherigen Code sieht folgendermaßen aus:
Start Length Name Class 0001:00401000 0000214D4H _TEXT CODE 0002:00423000 0000059B8H _DATA DATA 0003:004289B8 000002F24H _BSS BSS 0004:00000000 00000009CH _TLS TLS Detailed map of segments 0001:000000E4 00001038 C=CODE S=_TEXT G=(none) M=C:\TEMP\HELLO\HELLO.OBJ ACBP=A9 0001:0000111C 0000014F C=CODE S=_TEXT G=(none) M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\C0X32.OBJ ACBP=A9 . . . 0001:0001F484 00001F24 C=CODE S=_TEXT G=(none) M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\CW32.LIB|xx ACBP=A9 0002:00000000 000001E8 C=DATA S=_DATA G=DGROUP M=C:\TEMP\HELLO\HELLO.OBJ ACBP=A9 0002:000001E8 000000C8 C=DATA S=_DATA G=DGROUP M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\C0X32.OBJ ACBP=A9 . . . 0002:00004FD8 000009E0 C=DATA S=_DATA G=DGROUP M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\CW32.LIB|xx ACBP=A9 0003:00000000 00000244 C=BSS S=_BSS G=DGROUP M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\CW32.LIB|iostream ACBP=A9 . . . 0003:00002F04 00000020 C=BSS S=_BSS G=DGROUP M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\CW32.LIB|xx ACBP=A9 0004:00000000 0000009C C=TLS S=_TLS G=DGROUP M=C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\9.0\LIB\WIN32\RELEASE\CW32.LIB|xxv ACBP=A9 Address Publics by Name 0002:000024C4 @std@%basic_filebuf$b19std@%char_traits$b%%@3 0002:000010E8 @std@%basic_filebuf$c19std@%char_traits$c%%@3 0002:00002450 @std@%basic_ios$b19std@%char_traits$b%%@3 . . . Address Publics by Value 0001:000000E4 _main 0001:00000730 std::allocator<char>::allocator<char>() . . .
Neben den oben dargestellten Abschnitten wird mit der Option Detaillierte Segmente der neue Abschnitt Detailed map of segments in die Map-Datei eingefügt. Die detaillierte Liste der Segmente enthält (für jede Zeile):
- Die Startadresse (Segment:Offset) des Segmentmoduls
- Die Länge des Segmentmoduls
- Die Segmentklasse (C=)
- Den Segmentnamen (S=)
- Die Segmentgruppe (G=)
- Das Segmentmodul (M=)
- Die Segment-ACBP-Informationen (ACBP=)
Wenn dasselbe Segment in mehreren Modulen erscheint, wird jedes Modul in einer eigenen Zeile aufgeführt.
Das ACBP-Feld codiert die Attribute A (Ausrichtung), C (Kombination) und B (Big) in einem Satz von 4-Bit-Feldern, wie von Intel definiert. ILINK32 verwendet nur drei dieser Felder: A, C und B. Der ACBP-Wert in der Zuordnung wird als Hexadezimalzahl ausgegeben. Die folgenden Feldwerte müssen mit einem logischen ODER verbunden werden, damit der ACBP-Wert ausgegeben werden kann.
| Feld | Wert | Beschreibung |
|---|---|---|
|
A (Ausrichtung) |
00 |
Ein absolutes Segment |
|
20 |
Ein an Byte-Grenzen ausgerichtetes Segment | |
|
40 |
Ein an Word-Grenzen ausgerichtetes Segment | |
|
60 |
Ein an Paragraph-Grenzen ausgerichtetes Segment | |
|
80 |
Ein an Seitengrenzen ausgerichtetes Segment | |
|
A0 |
Ein nicht benannter absoluter Speicherabschnitt | |
|
C (Kombination) |
00 |
Kann nicht kombiniert werden |
|
08 |
Ein public-kombinierendes Segment | |
|
B (Big, für 16 Bit) |
00 |
Segment kleiner als 64 K |
|
02 |
Segment genau 64 K |
Verwendung von Map-Dateien
.map-Dateien enthalten hilfreiche Informationen für das Debuggen. Wenn Ihre Anwendung beispielsweise abstürzt (z.B. wegen einer Zugriffsverletzung), können Sie mit der Ergebnisadresse das Modul (Methode) ermitteln, in dem die Anwendung abgestürzt ist.