Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Složitější funkce ve watch při debugu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Složitější funkce ve watch při debugu

Autor: hanakus

0:29:31 08.04.2009

Prvně podívejte, zda-li daný symbol opravdu existuje, jak zmínil pan Ponkrác, kompilátor často kód optimalizuje - typicky gettery a settery atd. Takže si zobrazte Disassembly (Alt+8) a podívejte se jestli se opravdu volá instrukce [bold]call symbol (adresa)[/bold]. Pokud tam vidíte symbol, tak můžete v okně Immediate metodu zavolat nebo si ji dát do Watch.

Citovat příspěvek

 

Re: Složitější funkce ve watch při debugu

Autor: AnonymousUser

21:20:24 30.03.2009

A teď je otázkou, jestli to co píšete, že jste provedl jste skutečně udělal, a nebo si jenom myslíte, že jste to udělal. A v tom bych hledal jádro pudla.

Protože pokud linker tvrdí, že metodu nezná, Vy tvrdíte, že tam je v kódu a to včetně debug informací, tak buď linker, nebo Vy lžete. Jeden z Vás nemluví pravdu.

Miloslav Ponkrác
[url]http://ponkrac.net/complex-web-server[/url]

Citovat příspěvek

 

Re: Složitější funkce ve watch při debugu

Autor: kovarex

15:31:34 30.03.2009

Děkuji za popis, tohle je mi ovšem jasné.
Mám za to, že při vypnutí všech optimalizací a vypnutí inline funkcí, a generování debug informací by měl právě udělat to, že všechny metody se budou reálně volat tak jak jsou napsané ve zdrojovém kódu, a tedy by mělo být možné i volat danou funkci z watch okna.

Před tím než jsem napsal první zprávu, tak jsem nastavil v projektu všechno nejvíc debug jak jen šlo, možná bych mohl třeba postnout můj projekt file, že by se někdo podíval, jestli to není málo ?

Citovat příspěvek

 

Re: Složitější funkce ve watch při debugu

Autor: AnonymousUser

13:56:01 30.03.2009

Proboha, zcela základní princip funkce kompilátor × linker:

1) To, že program používá nějakou metodu, neznamená vůbec, že ta metoda vůbec v programu existuje. Pokud je třeba inline (až už díky klíčovému slovu inline, a nebo rozhodnutím optimalizátoru kompilátoru, nebo rozhodnutím optimalizátoru linkeru – ano dnes i linker musí optimalizovat, jinak by C++ vůbec nemohlo jako jazyk fungovat).

Když budu puntičkářsky přesný, a snad to osvětlí situaci: Používá se v programu kód metody, ale nikoli vždy nutně se nevolá (tedy ani nepoužívá, tedy nemusí ani existovat) metoda samotná.

2) Debugger najde pouze a jen metodu, ke které má k dispozici ladící informace (případně jiným způsobem zjištěný název).

Pro vysvětlení: To, že se volá metoda v programu znamená jen a pouze to, že se někde volá ADRESA METODY, ale v samotném PROGRAMU UŽ NENÍ A PROGRAM ANI NEZNÁ NÁZEV METODY, KTEROU VOLÁ, a ani tento název metody vůbec k ničemu nepotřebuje. Ba on v programu dokonce není vždy ani název třídy.

Takže i když se v programu volá metoda, tak samotný program neví, jak se ta metoda jmenuje. Je to stejné, jako když já na WC použiji toaletní papír, a umím ho použít i tehdy, když nevím, že ta věc, kterou jsem použil k hygieně se zrovna jmenuje „toaletní papír“. Stejné je to i s programem.

Tedy k tomu, aby debugger našel metody v programu, tak mu NESTAČÍ TO CO JE V PROGRAMu. Potřebuje něco navíc, další informace – a to jsou DEBUG INFORMACE. Stačí, když debugger nemá debug informace pro danou třídu, jejíž instanci voláte, a on prostě Vaší metody nemá jak najít!!! V programu, i když program funguje a program metodu volá není nikde obsaženo jméno metody. Program název metody nepotřebuje, debugger však ano.

Tak si dejte dohromady co z toho výše je Váš problém.

Miloslav Ponkrác
[url]http://ponkrac.net/complex-web-server[/url]

Citovat příspěvek

 

Složitější funkce ve watch při debugu

Autor: kovarex

12:08:39 29.03.2009

Mám následující problém, debuguji ve vs2005, a watch mi na normální proměnné, nebo jednoduché funkce funguje, ale některé metody (a vím že jsou slinkované a že se používají v programu), když dám do watche (nebo quick watche), tak to hlásí:
error: 'instnace->method()' does not exist.

Něco jsem o tom zkoušel googlit, a vypadá to, že možná vs umožňuje takovýmto způsobem spouštět jen metody(funkce), které neinicializují žádná data, což by asi i sedělo, protože daná funkce vrací std::string, který zinicializuje.

Tohle mi přijde šíleně nepraktický, doufám že by mohlo jít někde nastavit, aby to fungovalo, protože to samé třeba Borlandí builder zvládá bez problémů.

Díky za připadnou radu.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: