.[ ČeskéHry.cz ].
Boží tabulka: Visual C++ magic numbers :-)
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 14. duben 2012, 16:48:32    Předmět: Boží tabulka: Visual C++ magic numbers :-) Odpovědět s citátem

Našel jsem boží tabulku, tak dávám k dobru: http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

Tabulka ukazuje, jaká "magická čísla" dává Visual C++ do paměti před a za alokovaný blok, do neinicializované proměnné a do paměti už uvolněné. Je to příklad pro alokování 8 bajtů. Je jasné, že zkušení kodéři tohle mají v hlavě, ale myslím, že pro řadu lidí je tohleto dobrá pomůcka - doporučuji vytisknout a nalepit vedle monitoru. Smile))

Mimochodem tyhle ladicí vychytávky Visual C++ byly vždycky snadným argumentem, jak jsem u nás na katedře přesvědčil studenty-začátečníky v C++, že mají zahodit všelijaké frí toto a frí tamto a vzít si pořádný překladač. Plus samozřejmě možnost upravovat kód bez restartu aplikace. Protože zvlášť pro začátečníky s pointerama je nadstandardní podpora ladění životní nutnost.[/img]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 14. duben 2012, 21:44:12    Předmět: Odpovědět s citátem

Nějaký tabulky s hexa hodnotama jsou hlavně pro ty, co kvalitní prostředí naopak postrádají. Jestli tohle je tvůj argument pro používání Visual C++, tak to na tom to IDE musí být fakt hodně špatně.


_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 14. duben 2012, 22:54:32    Předmět: Odpovědět s citátem

Ta tabulka se určitě hodí na nízkoúrovňové ladění aplikací v cizích debuggerech (e.g. ollydbg), kde člověk přímo vidí obsah paměti a raw hodnoty proměnných. Jinak je to asi úplně zbytečná záležitost... Wink
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 15. duben 2012, 09:11:59    Předmět: Odpovědět s citátem

Crypton napsal:
Ta tabulka se určitě hodí na nízkoúrovňové ladění aplikací v cizích debuggerech (e.g. ollydbg), kde člověk přímo vidí obsah paměti a raw hodnoty proměnných. Jinak je to asi úplně zbytečná záležitost... Wink


jj tak nejak jsem nad tim premyslel a taky me napadlo akorat to vyuziti v ollydbg a spol. - jinak pri beznem debugu si tyhle Run-Time Checky hlida samo VS a neni potreba je znat ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 765
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. duben 2012, 11:24:36    Předmět: Odpovědět s citátem

Al> Nevím, jaké frí toto a frí tamto používáš ty, ale frí toto a frí tamto co používám já, dokážou vyprodukovat ladící výpisy ve tvaru
kód:
Invalid read of size 4
   at 0x40F6BBCC: (within /usr/lib/libpng.so.2.1.0.9)
   by 0x40F6B804: (within /usr/lib/libpng.so.2.1.0.9)
   by 0x40B07FF4: read_png_image(QImageIO *) (kernel/qpngio.cpp:326)
   by 0x40AC751B: QImageIO::read() (kernel/qimage.cpp:3621)
 Address 0xBFFFF0E0 is not stack'd, malloc'd or free'd

případně
kód:
Invalid write of size 4
  at 0x804838F: f (example.c:6)
  by 0x80483AB: main (example.c:11)
Address 0x1BA45050 is 0 bytes after a block of size 40 alloc'd
  at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
  by 0x8048385: f (example.c:5)
  by 0x80483AB: main (example.c:11)

nebo taky
kód:
40 bytes in 1 blocks are definitely lost in loss record 1 of 1
  at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
  by 0x8048385: f (a.c:5)
  by 0x80483AB: main (a.c:11)

...a tak dál. Takže není potřeba věštit chybu z tabulek, ale stačí si ji přečíst v logu Wink
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 15. duben 2012, 16:57:36    Předmět: Odpovědět s citátem

Takže pro ty, kteří se tu nesnaží jen o flamewar (tak na mě působí hlavně Marek, který nic k věci neuvedl, kromě posměšků a překrucování toho, co jsem já psal), uvádím, jak jsem k tomu došel: V C++ já programuju cca od roku 1994, kdy jsme se to začali učit ve škole. Visual Studio jsem začal používat prakticky výhradně od okamžiku, kdy jsem ho poprvé uviděl, to bylo někdy v roce 1997-98, protože bylo tehdy výrazně lepší než Borland C++, který jsme měli před tím. Výjimkou samozřejmě bylo složité programování GUI aplikací do Windows. Pak jsem v roce 2002 dostal za úkol učit na jedné ostravské fakultě jazyk C a studenti to tam patlali v tehdejším Linuxu, který vůbec nehlídal heap (ani Linux, ani C) a programy studentům fascinujícím způsobem běžely bez pádu i se strašnými pointerovými chybami. Takže z Ostravy znám takové to okřídlené "je to optimalizováno pro Linux" (neboli přeloženo do češtiny: ve Windows to hned padá s access violation, v Linuxu to projde i s tou chybou bez pádu). Potom na katedře v Olomouci jsem zažil kolem roku 2004 studenty, co masově používali obskurní Devc nebo jak se to jmenovalo, velmi primitivní vývojové prostředí bez nějakých ladicích vychytávek. No a proti tomu jsem jim mohl ukázat Visual Studio se spoustou výborných ladicích vychytávek, které třeba dnes v roce 2012 můžeme vidět i u konkurenčních nástrojů, ale před těmi 10-15 lety, ze kdy mám ty svoje zážitky, to jinde moc nebylo. A hlavně ne v tom, co jim ti jejich šílení učitelé doporučovali ve škole. Ono totiž my zkušení najdeme ty triviální chyby hned i se základním debuggerem nebo i jen pohledem do zdrojáku, ale začátečníci ne.

Další moje zkušenost je celkem čerstvá, a proto jsem taky vyhledal právě teď tu tabulku: Pracuju na jednom velkém projektu, který vznikl před 15 lety, je to mišmaš od různých autorů a je to takový propletenec globálních funkcí většinou v Céčku bez tříd. Dělám teď konverzi do Windows, předevčírem mi to tam začalo zmateně padat kvůli nulovému pointeru... samozřejmě chyba byla úplně jinde, než kde se projevovala a díky magickým číslům se objevila za 5 sekund, protože v jednom pointeru bylo 0xfeeefeee. Nicméně já se musím přiznat, že to číslo jsem viděl prvně v živoě, tohle se mi prostě nikdy nepřihodilo, kam moje paměť sahá (v Céčku už teď dělám málo, takže možná jsem na to jen zapomněl). Byla tam prostě uvolněná paměť, která se dál používala a naplnila se kvůli tmu spousta jiných proměnných řadou nesmyslů. Už si nepamatuju, jestil se to tam četlo nebo zapisovalo a co se tam vlastně dělo, ale nějaký ladicí textový výpis, co jste tu ukazovali, by nic neodhalil, protože delete[] se tam volalo jen jednou, jen se ta paměť potom dál používala. Číslo 0xfeeefeee to ale odhalilo. Jedna globální struktura s destruktorem ale bez copy-konstruktoru se tam předávala do jedné funkce hodnotou, místo referencí, takže se v té funkci uvolnila dynamická paměť, ale nevědělo se o tom... Jakmile tu chybu zjistíme, pochopení a oprava je mrknutím oka hotová.

No ale jelikož se tu nejedná o nějaké tahové hry nebo něco takového, ale o realtimové věci, blbě se to ladí nějakými debugovacími výpisy. Taky je často problém ten program restartovat a znovu uvést do stejného stavu, kdy se ta chyba vyskytla, proto je výborné mít tu možnost to bez restartu měnit. Přiznám se, že jsem tak oddaný Visal Studiu, že nevím, které další překladače/debuggery tohle umějí a od kterého roku tuhle funkci mají, ale Visualko to mělo už odedávna a drtilo tím konkurenci. Protože zvlášť ladit něco realtimového s DirectX, kdy si s tím člověk může poladit, změnit funkce a pokračovat bez restartu, je někdy velké plus. Zvlášť potom když se člověk babrá v cizím marastu, co jen od někoho převzal a upravuje.

A protože v Céčku jsem dělal hlavně před rokem 2002, čili posledních 10 let ani moc ne, tak jestli jsem nepostřehl, že místo magického 0xfeeefeee mám ve Visualku nebo jinde nějakou lepší a ještě jednodušší možnost, jak odhalit právě zde uvedenou chybu, tak mi prosím poraďte a poučte mě. (Napadá mě dát si breakpoint na paměťovou buňku, což by mě taky navedlo k původu té chyby, ale bylo by to daleko pracnější a různé obskurní fríí udělátka breakpointy při změně hodnot proměnné taky neumějí.)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 15. duben 2012, 17:20:17    Předmět: Odpovědět s citátem

Mám dojem, že tady někdo neslyšel o valgrindu (nebo možná jen slyšel, a to ještě za hluku projíždějícího vlaku po mostě nad ním).
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Tringi



Založen: 28. 07. 2007
Příspěvky: 289

PříspěvekZaslal: 15. duben 2012, 17:50:44    Předmět: Odpovědět s citátem

Jak fascinující je ten rozdíl mezi profesionály a akademiky.
Pro ty první je to rutina, i když iritující; druzí fascinovaně vyrábí dvacetiřádkový elaborát s historickou vsuvkou. Nechceš o tom vydat paper? Wink

Ad realtimový ..."You keep using that word. I do not think it means what you think it means."
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 15. duben 2012, 19:13:59    Předmět: Odpovědět s citátem

VS moc neznám, nějak jsem na něj zanevřel, tak bych se chtěl ujistit, že chápu o čem přesně mluvíš. VS v debug modu nastavuje při free do proměnné hodnotu 0xfeeefeee a to kvůli tomu, aby se tím dalo odhalit double-free a přistupování mimo alokovanou paměť?

Jak přesně funguje to "možnost to bez restartu měnit"? Jakože ti běží "realtime" aplikace, ty jí pauzneš, změníš nějaký kód, necháš to pokračovat a aplikace najednou běží nad novým kódem?

Jo a chtěl jsem se zeptat jak je to s tím realtimem na Windows. Je k tomu potřeba nějaké speciální vydání Windows nebo jak je náročné zkonfigurovat Windows pro realtime?

Dík
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 15. duben 2012, 19:18:00    Předmět: Odpovědět s citátem

Al napsal:
Takže pro ty, kteří se tu nesnaží jen o flamewar (tak na mě působí hlavně Marek, který nic k věci neuvedl, kromě posměšků a překrucování toho, co jsem já psal)


Ti, co mohou používat valgrind, používají valgrind. Ti, co ho používat nemůžou, mají prostě smůlu. Ne vždy systém shodí aplikaci při neplatném přístupu do paměti, ale valgrind vždycky ukáže, kde ten neplatný přístup je, aniž by aplikace kvůli tomu musela spadnout (ale může spadnout třeba na jiném stroji apod.). Sám říkáš, že nedoporučuješ používat frí toto... jenomže žádná plnohodnotná alternativa k valgrindu prostě není, ani komerční.

Jinak já jsem si v roce 1994 ještě hrál s hračkama a v roce 1995 jsem přešel na lego. Tak začala moje kariéra. Smile
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 15. duben 2012, 19:24:27    Předmět: Odpovědět s citátem

fri toto a fri tamto se obcas hodi - ted jsem zacal blbnout s QtCreatorem a neni to vubec spatne - skoda ze aktualni verze se nema rada s CDB z VS, ale tak jedu nad MinGW a GDB a velice dobre
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 15. duben 2012, 19:38:51    Předmět: Odpovědět s citátem

Trochu odbočím od tématu: Povedlo se někomu z vás rozchodit debugger nad 64-bitovými binárkami vypadlými z mingw64?
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 15. duben 2012, 23:26:55    Předmět: Odpovědět s citátem

Ano, VS podporuje změnu C++ zdrojáku při debugování - překompiluje a program běží dál. Jmenuje se to Edit & Continue.

Abych udělal Alovi radost, tak tyhle speciální hodnoty v paměti se taky v praxi hodí, člověk pozná, co je ta paměť zač. Na Valgrind to samozřejmě nemá... ale ani ten nejde použít když program nenasytně žere paměť...
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1525
Bydliště: Telč

PříspěvekZaslal: 16. duben 2012, 08:44:05    Předmět: Odpovědět s citátem

Díky za tabulku, některý ty věci jsem už věděl, ale přehled je dobrej.

Mimochodem, řadím se k profesionálům. V 2K se debugovalo hodně hodně low-level. Ne každá chyba se dá snadno znovu navodit, proto se používalo spoustu triků, magická čísla nevyjímaje.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 16. duben 2012, 17:50:48    Předmět: Odpovědět s citátem

Mna len stve, ze prve tri roky (~2001), ked som sa najviac pachtil s pointermi (a nepouzival safeptr), som o tom nevedel. Potom som si vsimol ten pattern a zistil co je CD,DD,FE a uz bolo debugovanie hned o rad jednoduchsie.

Aj nedavno v robote mi to ulahcilo zivot, ked som za 10 min. zistil, ze preco nam to pada.


Preco toto nie je v kazdej dokumentacii a clanku o kodeni vo Visualku ?
Toto by malo byt povinne druha cast kapitoly o pointeroch v kazdej knihe (ak je pro-win orientovana).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna