Trapi me gdb

Egon Eckert egon na www.capitol.cz
Čtvrtek Prosinec 11 15:55:02 CET 1997


Zdravim,

velmi me trapi gdb. Debuguju vetsi program v c++ (binarka ma vcetne debug
info) asi 800 kilo, a gdb je casto seredne zmaten. Nahodne nefunguje 'next'
ani 'step' (rozbehnou se dopryc), nema tuseni o existenci lokalnich
promennych, nevi kde je (!) - napriklad :

<--- cut --->
(gdb) c
Continuing.

Breakpoint 3, PrecalcList::Get () at ../tools/precalc.cpp:331
(gdb) info break
Num Type           Disp Enb Address    What
3   breakpoint     keep y   0x08062a20 in Holder::avail(void) const
                                       at ../tools/precalc.cpp:331
	breakpoint already hit 1 time
(gdb) info locals 
this = (Holder *) 0xda9
(gdb) info stack
#0  PrecalcList::Get () at ../tools/precalc.cpp:331
#1  0x8058bdc in Handler_Manip::Run () at ../tools/h_manip.cpp:430
#2  0x804ccc6 in MetaServer::Step (this=0x809c128, sn=35)
<--- cut --->

Koukejte : program se zastavil na breakpointu 3 ve funkci PrecalcList::Get.
Gdb se ovsem domniva, ze breakpoint 3 lezi ve funkci Holder::avail a 'info
locals' je taky nesmyslne, protoze PrecalcList::Get (ve ktere se doopravdy
nachazi), je staticka (takze nema this) a ma spoustu lokalnich promennych.
'info stack' je ale spravne.

Holder::avail je definovana inline, vsechny moduly jsou prelozeny samozrejme
s -g, bez -O*. Takze se IMHO inline expansion nekona.

Funkce PrecalcList::Get je v modulu precalc.o definovana jako posledni, za
ni nasleduji uz jen definice pouzitych inline funkci, jako prave treba
Holder::avail, ktera je tam jako uplne posledni (v sekci .text).

System je Debian 1.3.1 (gdb 4.16, gcc 2.7.2.1, jadro 2.0.30).

Co myslite, ze ho plete ? Staticke metody ? (Ne)inline funkce ? C++ ?

Diky za namet,

Egon Eckert


Další informace o konferenci Linux