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