Ich versuche, einige STL-basierten C++ - Code in GDB zu debuggen. Der Code hat so etwas wieHinzufügen von Funktionen in GDB zur Laufzeit
int myfunc()
{
std::map<int,int> m;
...
}
Jetzt in GDB, innen myfunc mit "print m" gibt etwas sehr hässlich. Was ich
void printmap(std::map<int,int> m)
{
for(std::map<int,int>::iterator it = ...)
{
printf("%d : %d", it->first, it->second);
}
}
Dann in gdb tun
(gdb) call printmap(m)
empfohlen kompiliert wie
etwas gesehen Dies scheint ein guter Weg, um das Problem zu umgehen ... aber kann ich eine separate printmap setzen in Objektdatei (oder sogar dynamische Bibliothek), die ich dann zur Laufzeit in gdb lade, anstatt sie in meine Binärdatei zu kompilieren - das Kompilieren der Binärdatei jedes Mal, wenn ich eine andere STL-Variable betrachten möchte, macht keinen Spaß. o Datei für die Druckroutine kann akzeptabel sein.UPDATE:
Angeregt durch Nikolais Vorschlag an Ich suche dlopen/dlsym.
Also habe ich noch nicht funktioniert, aber es fühlt sich an wie ich näher komme.
In printit.cpp
#include <stdio.h>
extern "C" void printit()
{
printf("OMG Fuzzies");
}
Compile zu einem .so
g++ -Wall -g -fPIC -c printit.cpp
g++ -shared -Wl,-undefined,dynamic_lookup -o printit.so printit.o
mit
meine Testanwendung starten und die .so laden mit dlopen (2 = RTLD_NOW) dann versuchen, das Symbol zu erhalten für eine Debugging-Funktion mit dlsym.
(gdb) break main
(gdb) run
(gdb) print (void*) dlopen("printit.so", 2)
$1 = (void *) 0x100270
(gdb) print (void*) dlsym(0x100270, "_printit")
$2 = (void *) 0x0
So nah, aber aus irgendeinem Grund kann ich nicht, dass das Symbol bekommen ... (Ich kann es sogar, wenn ich die setzen dlopen/dlsym Anrufe in meine ausführbare Datei) Ich vermute, ich bin entweder die Erstellung der lib falsch oder dlsym falsch verwenden.
Wenn ich das Symbol bekommen kann ich gehe davon aus ich die Funktion aufrufen kann so etwas wie
(gdb) print ((void(*)())(0x....))()
ich mit diesem auf OS X 10.4 bin kompilieren, die einige meiner .so Leiden verursachen könnte. .. irgendwelche Hinweise würden geschätzt werden.
herausgefunden, wie all dies funktioniert. Habe als Lösung unten gepostet.
Ja, ich kümmerte mich nicht wirklich, ob der Anruf die Argumente kopierte oder nicht. Aber diese Lösung ist immer noch unpraktisch für mich, denn wenn ich eine andere STL-Klasse betrachten möchte, muss ich meine Binärdatei neu kompilieren und gdb neu starten. Sie können jedoch mit dlopen auf etwas zugreifen. Ich werde weiter untersuchen. –
Oh, du wolltest eine Lösung * jetzt *, ohne die gdb Konsole zu verlassen? Kinder in diesen Tagen ... :) –