Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 14. duben 2012, 16:48:32 Předmět: Boží tabulka: Visual C++ magic numbers :-) |
|
|
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. ))
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. duben 2012, 21:44:12 Předmět: |
|
|
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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 14. duben 2012, 22:54:32 Předmět: |
|
|
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...  _________________
 |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 15. duben 2012, 09:11:59 Předmět: |
|
|
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...  |
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 |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 15. duben 2012, 11:24:36 Předmět: |
|
|
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  _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 15. duben 2012, 16:57:36 Předmět: |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 15. duben 2012, 17:20:17 Předmět: |
|
|
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 |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 15. duben 2012, 17:50:44 Předmět: |
|
|
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?
Ad realtimový ..."You keep using that word. I do not think it means what you think it means." _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 15. duben 2012, 19:13:59 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. duben 2012, 19:18:00 Předmět: |
|
|
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.  _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 15. duben 2012, 19:24:27 Předmět: |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 15. duben 2012, 19:38:51 Předmět: |
|
|
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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 15. duben 2012, 23:26:55 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 16. duben 2012, 08:44:05 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 16. duben 2012, 17:50:48 Předmět: |
|
|
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 |
|
 |
|