Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Nudou jsi opuch?
Navštiv Lopuch!

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: lfmzgla
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
mach 22.9.2008 14:57  732
Bredy: Diky. Prozkoumal jsem ruzny debugovaci nastroje a nakonec se dostal k tomu, ze sem to zkompiloval pod Linuxem a gdb/valgrindem (ktery jestli to dobre chapu kontroluje ty "narazniky", pokud je tam teda gcccko s parametrem -g da) nasel leakovani pameti :-)
bredy 19.9.2008 01:03  731
Při sledování paměti možná pomůže tohle Magic debug values
bredy 19.9.2008 00:56  730
Tohle se mi často dělo u objektů s počítanou referencí. Jedno vlákno snížilo referenci a druhé z výšilo. Občas se to ale trefilo mezi, že ti pak byl schopen vyjít výpočet tak že 1 + 1 = 1 (protože druhé vlákno z toho udělalo 0 a 0 + 1 = 1. Pak došlo k tomu, že jedno vlákno uvolnilo paměť (čítač referencí klesl na nulu) a to druhé tam následně zapsalo jedničku. Člověče, dost mě šokovalo, jak často mi to takhle spadlo.

Jinak tahle chyba se detekuje tak, že v debug verzi je paměť vyplněná známou hodnotou. Hodně pak pomůže prozkoumat obsah změnené paměti, zda změna neodpovídá něčemu. Například já na to přišel tak, že jedno 32-bit slovo tam bylo inkrementováno (mám pocit, že se to vyplñuje CDCDCDCD a já tam viděl CECDCDCDCD, takže to bylo jasné). A pozor na to, že chyba se může objevit až za hodně dlouho. Doporučuju logovat alokace a při vzniku chyby si projít log a najít tu alokaci, která paměť alokovala a dealokovala.

Pokud používáš nějaké chytré pointery, tak čítače referencí by měly být měněny přinejmenším funkcí InterlockedIncrement / Decrement, namísto obyčejné ++

Jo, aspektem téhle chyby je, že vzniká náhodně. Pokud ti vzniká pravidelně, tak tam někde skutečně zapisuješ do dealokované paměti. Ale to by mělo jít debugerem snadno zjistit.
mach 18.9.2008 23:18  729
BredyPresne tak, mam tam dve vlakna. Jedno je hlavni (stara se o vypocty, posila veci do OpenGL, …), druhe o nacitani obrazku. Dve knihovny jsou pouzivany v obou vlaknech (OpenGL a OpenCV) - ani u jedne nevim, jak moc je thread safe, takze tam mam dva mutexy (definovany jako globalni promenny) a pres ne je zajistena exklusivita pri praci vlanka s tema knihovnama. (Na ty mutexy pouzivam knihovnu pthreads-win32.)
bredy 18.9.2008 21:48  727
machNeběží ti tam dvě vlákna (nebo vice?)
mach 18.9.2008 20:16  726
Prosim, zabijte me.Mam muj program (na Windows XP + MSVC 2008 Express) a pada mi s touhle hlaskou:

HEAP[insight3d.exe]: HEAP: Free Heap block 293c770 modified at 293c780 after it was freed
Windows has triggered a breakpoint in insight3d.exe.


Dela to celkem nahodne:

  1. Casto pri nejake interakci s GUI (jako GUI knihovnu pouzivam Agar, ale neni to zas tak dulezite). Vetsinou mi pak Visual Studio zustane viset uvnitr funkce z te GUI knihovny.
  2. To same se mi ted zacalo dit i po napsani jedne funkce, ktera celkem intenzivne alokuje a dealokuje pamet (ale ne moc sofistikovane, nevypada to, ze tam mam overflow). V tomhle pripade to skonci provedenim free().

Pouzivam hodne (cca 10) cizich knihoven a hodne hodin uz na to nemuzu prijit. Tipuju, ze nejpravdepodobnejsi jsou dve moznosti:

  1. nektera z tech cizich knihoven prepisuje neco, co nema
  2. linkuju dohromady spatne verze knihoven (= zkompilovane pod ruznymi runtime)

Da se tohle nejak rozumne vydebugovat? Muzu u knihovny (.lib nebo .dll) zjistit, s kterym runtimem je zkompilovana (LIBCMT.lib nebo MSVCRT.lib)?

Co vim, tak clovek nesmi pouzivat dohromady knihovny zkompilovane s /MD a /MT - musi to byt jednotne. Kdyz se to pomicha, tak jednak linker zahlasi warning, ze spolu koliduji MSVCRT.lib a LIBCMT.lib a taky to muze odlitavat. Prosel jsem vsechny pouzivane knihovny a bud je prekompiloval nebo se alespon podival, co autori tvrdi. Ted bych tedy mel mit vsechno kompilovane jako "Multi-thread DLL" (/MD). Ale porad mi to pada.

Asi nejzavaznejsi dotaz: Muzu vzit knihovny (.lib, .dll) zkompilovane pod MSVC 2005 a pouzivat je v MSVC 2008 Express (tedy asi se muze stat, ze treba knihovny budou zkompilovane spolu s MSVCRT70.lib a hlavni program s MSVCRT80.lib). Pritom pokud nejaka knihovna alokuje pamet, tak ji uvolni jen ta sama knihovna - nikoliv jina.
bredy 9.9.2008 15:34  725
Serial o serializaci IIDruhý díl o serializaci
bredy 27.7.2008 01:54  724
C++ nezvládne automatické klonování objektů. Ale dá se to aspoň takhle poloautomaticky:

Automatické klonování objektů v C++
bredy 16.7.2008 16:31  723
Opět tu mám článek popisující třídu, která lecckomu může vrátit spánek z bezesných nocí:

Jak sdílet prostředky (resources) v C++
bredy 22.5.2008 15:20  722
Seriál o serializaciRozpracoval jsem seriál o serializaci. Opět pro začátečníky zajímající se o šablony.
amon Amon Nuo ani Anquietas. Hic qua videum. 15.5.2008 20:40  721
jo díky to je přesně ta knihovna :) má to i klasickej select, takže tam dám timeout a budu obsluhovat klienty sekvenčně :) ještě jednou díky :)
bredy 15.5.2008 10:06  720
Změnil jsem trošku seznam zajímavých článků v hlavičce. Chtěl bych zejména upozornit na článek řešící palčivý problém "Jak bezpečně ukončit vlákno z DllMain". Upozorňuji, že řešení tam opravdu najdete. Další způsob, jak něco rychle alokovat a dealokovat ukazuje článek "FastAllocPool - urychlení častých alokací a dealokací" napsaný tak, aby způsob implementace pochopil i začátečník (a pronikl do světa šablon). Pro porkočilejší bych tu měl dva články řešící problém kterak zabalit parametry volání (a i samotné volání) do objektu a nakládat s nimi. Článek "Tuply v C++" představuje způsob, jak vytvářet v C++ neomezeně veliké kontejnery umožňující uložit libovolnou hodnotu libovolného typu a jak je využít pro předávání parametrů. Navazující článek "Akce a zpráva jako objekt pak představuje praktickou ukázku Tuplů na vytváření delegovaného volání funkce či metody. Odkazy ukazují na "druhé díly" a v článcích najdete i odkaz na první díly.

Nicméně už se těším na nové C++, které výše zmíněné komplikované šablony radikálně zjednodušší. I tak to v současné verzi C++ vytváří prostor pro neuvěřitelné množství možností a často výrazně zjednodušuje práci.
bredy 15.5.2008 09:50  719
AmonNo a na jakém OS?

V linuxu je to
#include <sys/socket.h>

a ve Windows
#include <winsock2.h>
a knihovna ws2_32.lib


jinak nevím. Sockety jsou v každé OS trošku jinak, i když základ je stejný. Stejně tak i obsluha více klientů se dost liší. Zatímco v Linuxu kraluje fork() ve Windows ho nehledej. Tam si musíš pomoci vlákny nebo asynchroními funkcemi jako WSAAsyncSelect(), které využívají message queue a posílají ti do ní zprávy kdykoliv se stav socketu změní.
amon Amon Nuo ani Anquietas. Hic qua videum. 14.5.2008 17:03  718
zdravim, potřebuju do školy naprogramovat v C server obsluhující více klientů najednou. chtěl bych na to jít a la Boa, jeden proces a pomocí select vybírat klienty, jenom má problém, že ani v Cbuilderu ani v Eclipce C/C++ nejsou potřebné knihovny pro správu socketů, packetů apod, které by měly být normálně k mání. neví někdo kde ty knihovny sehnat a jak je potom dostat do include souborů?
bredy 18.12.2007 23:08  717
tomu nerozumim, zkus to nejak blíže popsat.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt