Anzeigen: Delphi C++
Anzeigeeinstellungen

Option "Detaillierte Segmentzuordnung"

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.

Siehe auch

In anderen Sprachen