Home

Linker-Fehler und c++filt

Dienstag, 30. November 2010 | Autor:

Lin­ker-Error sind aus zwei Grün­den ekel­haft:
Ers­tens: Sie sind kryp­tisch sind, viel kryp­ti­scher als Com­pi­l­er­feh­ler (ja, das geht).
Zwei­tens: Sie tre­ten unter Umstän­den erst zur Lauf­zeit auf.

Bei­spiel:
could not load plugin './algoStore/visAlgoslibStreakSurface.so' :./algoStore/visAlgoslibStreakSurface.so: undefined symbol: _ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E

Okay, undefined symbol - da haben wir wohl irgend­et­was dekla­riert, aber nicht defi­niert1. Aber was genau haben wir nicht defi­niert?
_ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E?
Manch­mal kann man erra­ten, was gemeint ist, da die Namen der invol­vier­ten Funk­tio­nen, Klas­sen, Varia­blen in dem Wust irgend­wo drin ste­hen. Aber eben nur manch­mal. Die Lösung die­ses Pro­blems lau­tet c++filt!

c++filt ist ein klei­nes Tool, das einem die Sym­bol­na­men ent­zif­fert! („demang­led”). So wird’s benutzt:

> c++filt _ZN23FStreakSurfaceAlgorithm10split_edgeESt4pairI6FArrayS1_E
FStreakSurfaceAlgorithm::split_edge(std::pair<FArray, FArray>)
>

und schon ken­nen wir den Klar­na­men des Sym­bols! Ein­fach toll - ich wünsch­te, ich hät­te die­ses Tool schon frü­her gekannt!

  1. Dekla­ra­ti­on = „Es gibt die­se und jene Funk­ti­on!” Bsp: void funktion(double k); Dekla­ra­tio­nen ste­hen typi­scher­wei­se in Hea­der-Files. -- Definition/Implementation = „Die Funk­ti­on tut die­ses hier.” Bsp: void funktion(double k){ return 1./(k+1); } -- Man beach­te, dass die Dekla­ra­ti­on wirk­lich eine rei­ne Exis­tenz­be­haup­tung ist und erst die Defi­ni­ti­on das Ver­hal­ten der Funk­ti­on defi­niert, d.h. den Code ent­hält, den die­se aus­führt.

Thema: Programmieren | 4 Kommentare

Debugger - GDB

Montag, 22. November 2010 | Autor:

Debug­ger sind Pro­gram­me, die einem bei der Feh­ler­su­che hel­fen sol­len. Mit einem Debug­ger kann man das Pro­gramm qua­si bei der Arbeit beob­ach­ten: Wel­che Code­zei­le wird als nächs­tes aus­ge­führt? Was ent­hält die­se und jene Varia­ble momen­tan? Wie sieht der Call-Stack/Back­trace momen­tan aus? An wel­cher Stel­le stürzt das Pro­gramm genau ab? und vie­les ande­res mehr.

Für C++ (und jede Men­ge ande­rer Spra­chen) gibt es den GNU-Debug­ger, kurz GDB. wei­ter…

Thema: Programmieren, Sezierte C++-Käfer | Beitrag kommentieren