2008-09-12 14 views
1
1167  ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1); 
(gdb) n 
1168  if (!ptr) { 
(gdb) print ptr 
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa" 
(gdb) print &cwd 
$2 = (char (*)[3500]) 0xbff2d96c 
(gdb) print strlen(cwd) 
$3 = 36 
(gdb) print "%s",cwd 
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"... 
(gdb) print "%s", ptr 
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa" 
(gdb) Quit 

Neden ptr dizeyi doğru yazdırıyor, ancak cwd değil; Bu da programı etkiler ve cwd ...gdb print ptr ile karıştırılır ve baskı "% s"

[değiştir: kullanmayı denerseniz çöküyor bu kilitlenme bu varyasyon üzerinde bir aptal arabellek taşması nedeniyle ortaya çıktı ... grr ... gdb değil, ama baskı soru "bayt tampon" muhtemelen gdb özgüdür olarak ptr olarak güzel biçimlendirilmiş dize ve cwd görüntülenir

+0

herhangi bir kişi, daha fazla bilgi vermesi için başlığı düzenlemek ister? Bunu yapmak için temsilcisi yok –

cevap

2

cwdgdb farklı basılır nedenidir. Bu nedenle, ptr yazarken, işaretçi değerini (ve aynı zamanda işaret ettiği bir dize olarak) yazdırır ve cwd yazdırırken tüm dizisini yazdırır.

cwd'un ptr yerine neden kullanılmasına sebep olacağına ilişkin bir neden göremiyorum, ancak emin olmak için bazı kodları görmem gerekiyor.

1

O] hala geçerli oldu. Her durumda, başvurunuzu etkilememelidir; man 3 getcwd, ptr'a göre cwd işaret etmelidir (veya bir hata oluştuğunda NULL olmalıdır). Program çökmeden ptr kullanabilir misiniz?

0

Ne tür bir cwd? Yukarıdaki kod snippet'i bunu bize söylemiyor. Bir boşluğun * olması, gdb tarafından farklı şekilde ele alınabilir. gdbptr (çıktınıza gösterildiği gibi) cwd uzunluğu 3500 bir dizisi olan bir char * (I tahmin) ve olduğunu bildiği için

5

Mweerden ile katılıyorum. gdb den

(gdb) print cwd 
$1 = "/media", '\0' <repeats 782 times>, "\016���" ... 
(gdb) print (char*) cwd 
$2 = 0xbfc8eb84 "/media" 

, bu nedenle gdb anlatmak bir şekilde yorumlamak için eğer ederken, cwdchar cwd[3500] olarak tanımlandı beri, gdb tüm dizi yazdırır görünüyor: Ben senin koduna benzer olduğuna inanıyoruz şeyler deneyerek, ben olsun char*, beklediğiniz gibi çalışacaktır. Uygulamanız çökerse, başka bir şey yüzünden olduğunu varsayabilirim.