GDB shlibek automatikus betöltése

Fórumok

GDB shlibek automatikus betöltése

Hozzászólások

Lehet, hogy hulyeseget mondok, de probaltad mar valamilyen frontend-el is?
Pl.: CGDB, esetleg RHIDE.

a gondom a következő:
nem tudom a gdb-t arra kényszeríteni (sem parancssori paraméterekkel, sem indítás utáni beállításokkal), hogy a shared library-ket amelyeket a programom használ automatikusan betöltse.
a gdb doksi értelmében:


GDB automatically loads symbol definitions from shared libraries when you use the `run' command, or when you examine a core file. (Before you issue the `run' command, GDB does not understand references to a function in a shared library, however--unless you are debugging a core file).

a texinfo "Non-debug DLL symbols" node-jában (amelyik bár a cygwines gdbre vonatkozik (esetemben a linuxos gdbről van szó), elvileg ennek a funkciónak platformfüggetlennek kellene lennie) ezt találtam:


Note that before the debugged program has started execution, no DLLs will have been loaded. The easiest way around this problem is simply to start the program -- either by setting a breakpoint or letting the program run once to completion.

tehát ennek értelmében pedig a program elindításához nem feltétlen kell a "run" (vagy "start") parancsot használni, elegendő egyetlen breakpoint betétele.

amikor a "fenris" nevű programot akartam feltenni (amely segít pl strippelt libek "felöltöztetésében"), akkor a "build" script, amelyet az installkor használ a program egyébként pontosan ezt a trükköt alkalmazza. azaz, betesz egy breakpointot, majd megpróbálja a "getuid" nevű funkció első két word-jét megjeleníteni (x/2w getuid).

ez nálam viszont nem működik, nálam ugyanis nem elegendő egyszerűen egy breakpointot betenni, a programot el is kell indítani ahhoz, hogy a shared libek (és így a symek is) betöltődjenek. enélkül nem találja a getuid funckiót és EZ a gondom.

a kérdésem tehát az lenne : tudja valaki létezik e valamilyen kapcsoló amellyel rá lehet kényszeríteni a gdb-t arra, hogy előre betöltse a shlibeket? próbálkoztam a --readnow-al, de nem ment. próbáltam egy halom trükköt és mindenféléket, de az egyedüli megoldás annak tűnik, ha hagyom, hogy a gdb magától betöltse őket amikor elindítom a programot. a "workaround"-om pillanatnyilag az, hogy átírom a fenris build scriptjét úgy, hogy a breakpoint után el is indítsa a programot és csak EZUTÁN kérje le az infót a getuid funkcióról.

ötletek? egyébként könnyű kipróbálni, elég egy szimpla C progit összerakni (pl int main(){ return(0);} :)), dinamikusan linkelni a libcvel (vagy egyszerűen simán gcc-vel lefordítani, ami ezt megteszi), majd betölteni a gdb-be és "disass getuid" vagy "x/2w getuid", ha összejön, akkor a shlibek betöltődtek, ha nem, akkor nem.

kösz :)

ui a problémára ha nincsen "gyógyír" bár a fejemet nem fogom a falba verni, eléggé idegesítő lenne. van néhány hülyesége a gdb-nek amelyeket nem tudok megérteni. ide tartozik pl az is, hogy a regiszterekre nem lehet watchot tenni míg a program nem fut.
pl ha a $esp-re (ESP reg) watchot akarok tenni, akkor először be kell állítani egy breakpointot, elindítani a programot, betenni a watchot, lelőni a programot, majd újra elindítani. nyilván a feature nem a legnépszerűbb, máskülönben már hozzáadták volna, de _szerintem_ esetenként igen hasznos lehetne (pl asm kód debuggolásakor).

[quote:2dac25de4c="begyu"]Lehet, hogy hulyeseget mondok, de probaltad mar valamilyen frontend-el is?
Pl.: CGDB, esetleg RHIDE.

őszintén szólva nem (ddd van fenn egyébként), de a cél az, hogy batchben is tudjam futtatni (gdbt ugyanis lehet scriptelni, amit többek között binárisok patchelésére is fel lehet használni). próbáltam egyébként azt is, hogy egyenként betöltöm a shared libeket, de ez meg azért nem jó, mert alapállásban nem tudom melyek léteznek, bár ldd-vel ki lehetne szedni őket egyenként, betölteni egyenként stb... de akkor már egyszerűbb ha ráteszek egy breaket a main()-re, elindítom, majd kikeresem a shared libekben fellelhető funkciókat.
a gyanúm egyébként az, hogy valamikor régen a gdb-nek elég volt egy sima breakpoint is ahhoz, hogy a shared libek betöltődjenek és ezt később elvetették.
mindenesetre kösz :)