bug v gdb?

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Úterý Únor 27 01:24:50 CET 2007


On Mon, 26 Feb 2007, Filip Krejci wrote:

> Breakpoint 1, main () at test.c:11
> 11        rec_t* rec = (rec_t*) calloc(sizeof(rec_t),1);
> (gdb) display rec->id
> 1: rec->id = 14087541109396006948
> (gdb) n
> 12        rec->id      = 10000;
> 1: rec->id = 580477714956288

To jsou divná hausnumera.

Co vypíše "p rec->id"? "p *rec"? "p rec" a "p &(rec->id)"?
A co "x/3x rec"? (Tj. je to blbě v paměti, nebo to jen gdb blbě ukazuje?)
Jak vypadá zkompilovaný kód ("disassemble main")?

Ještě by mohlo být zajímavé zkontrolovat, jak vypadají ladící informace
generované překladačem (viz "objdump --stabs"...tedy za předpokladu, že
Vám kompilátor generuje STABS). Ale kecal bych, kdybych tvrdil, že těm
datům moc rozumím. Mne to třeba vypsalo (v jedné konstelaci verzí), mj.:

163    LSYM   0      0      00000000 5092  rec_t:t(0,22)=(0,23)=s12d:(0,2),0,8;id:(0,7),32,64;;

což je asi popis té struktury a mělo by to znamenat, že typ rec_t
(identifikovaná jako (0,22) a bůhvíproč i (0,23)...možná je to výsledek
toho typedefu) je struktura o délce 12 bajtů (s12) skládající se z položky
d typu char ((0,2) -- odkaz na jiný LSYM), která začíná na offsetu 0 a má
8 bitů, a položky id typu long long (0,7), která začíná na offsetu 32 bitů
(tj. 4 bajty) a má 64 bitů (8 bajtů).

Ale můžete zkusit pomocí různých prodloužení parametru -g (-gstabs,
-gdwarf atd.) generovat různé druhy ladících informací a uvidíte.


On Mon, 26 Feb 2007, Ing. Pavel PaJaSoft Janoušek wrote:

> 	Tak mne ted jen napadlo, zda-li nahodou ANSI C nepozaduje, aby se
> literal typu long long psal s L vpravo nebo tak něco [...]

To sice ano, ale když tady je řeč o čísle 10000, které se v pohodě vejde
do intu a při přiřazení by si kompilátor měl tu konstantu přetypovat.


On Mon, 26 Feb 2007, Filip Krejci wrote:

> Horák Jan napsal(a):
> > Mno tak mne to funguje
> 
> Hmm, tak to asi mam moc "stare" gdb.

Můžu vás ubezpečit, že to funguje i s GDB 4.16 a GCC 2.7.2.1 (takovou
vykopávku jsem vyhledal!). Prostě hledejte chybu na svém přijímači.


--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."





Další informace o konferenci Linux