Re: Ladění problému ve stacku
Jiri Kosina
jikos na jikos.cz
Čtvrtek Září 16 15:12:35 CEST 2010
On Thu, 16 Sep 2010, Ladislav Vaiz wrote:
> mám program v C, kde je někde skrytá chyba, asi nějaké přetečení:
>
> void funkce(){
> struct dirent **namelist = NULL;
> int n, i;
> char *neco;
> ...
>
> ...
> n = scandir(...);
> spousta_kodu();
> a_volani_funkci();
>
> for (i=0;i<n;i++) free(namelist[i]);
> }
>
> Volání free(namelist[32]) vyvolá segmentation fault, protože n bylo spoustou
> volání přepsáno na nesmysl (31671296, ale mění se to).
>
> Jak odladit, kde to "ustřelilo" do n?
>
> Gdb příkaz watch nefunguje, zakřičí, že proměnná n pozbyla platnosti. Patrně
> jde o softwarový watchpoint. Hardwarový mi nefunguje ani pod rootem. Zkoušel
> jsem přidat globální pointer na n a do podezřelých funkcí dát výpis. Pak se
> ale chyba neprojeví, asi to ustřelí jinam. Je to Debian Lenny, AMD64.
>
> Netušíte, co s tím?
Pokud se vam nechce tu spoustu kodu auditovat "ocima", nez chybu najdete,
doporucuji zkusit pustit to pod valgrindem.
--
Jiri Kosina
Další informace o konferenci Linux