Udv!
A processzem 100%on teker, amit biztosan valamelyik threadje okoz, ezeket szeretnem debugolni/profileolni.
Ugye a sima process profiling nem vezet itt eredmenyre.
jelenleg oprofile al problakozok, opreport -l { tid:1 } { }
errort ad vissza, hogy a specifikacio tul strict... ez nekem zsakutca lett, doksi nem magyarazta meg mi lehet itt a problema.
Van estleg otlete vagy ajanlasa egy jo progira(annak gyors hasznalataval egyutt) valakinek, hogy hogyan lehetne minnel fajdalommentesebben profilolni a threadeket?
koszi,
Zsolt
- 1385 megtekintés
Hozzászólások
Valgrind / Cachegrind / VTune?
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
valgrind ot probletam mar, osszefost* magat, hasznalhatatlannak iteltem a problemara
tobbit megnezem
zsolt
- A hozzászóláshoz be kell jelentkezni
subscribe
- A hozzászóláshoz be kell jelentkezni
Bővebben a programról? Konzolos alkalmazás vagy valamilyen GUIt is használsz?
- A hozzászóláshoz be kell jelentkezni
Ez miert lenyeges? :)
konzolban futtatom tipikusan.
zsolt
- A hozzászóláshoz be kell jelentkezni
Oprofile/Vtune barmelyike jo lesz neked.
Az oprofile azert nem adott eredmenyt, mert nem volt 1-es thread id. Gyujtsd ossze egy logba az osszes thread id-t es azokat add at parameterkent.
- A hozzászóláshoz be kell jelentkezni
az 1 itt csak egy pelda volt.
honnan derithetem ki az id-kat?
de ezek szerint nem novo rendben egesz szamok az id-k... 10 thread van, de ezekszerint az id nem 1-10ig a szamok :D
zsolt
- A hozzászóláshoz be kell jelentkezni
ps -L
- A hozzászóláshoz be kell jelentkezni
Ez azon mulik, hogy mennyi rahatasod van a programra es a futtatasi kornyezetre.
(1) Ha van forraskodod, akkor az osszes thread letrehozas muvelet (pthread_create) elso parameterben adja vissza a threadid-et. Ha ezt kilogolod, akkor kesobb felhasznalhatod az oprofile reportok szuresehez.
(2) Ha nincs forraskodod, akkor kell csinalni egy egyszeru shared objectet, ami definialja a pthread_create muveletet (termeszetesen azonos szignaturaval, mint a libpthread). Ket kis fuggvenyre van szukseged:
- a .so _init fuggvenyeben dlsym hivassal kikeresi a valodi (libpthread.so -ban definialt) pthread_create fuggveny cimet es egy statikus fuggvenypointerben eltarolja.
- a .so pthread_create fuggvenyben delegalja beerkezo hivast az eltarolt fuggvenypointer fele, es visszatereskor egy file-ba, vagy naploba kiirja a thread_id-t.
Ha ez megvan akkor a kovetkezo modon kell futtatnod az alkalmazasod: LD_PRELOAD=./libfakepthread.so yourprogram
Ez akkor is mukodik, ha a program csak binaris formaban van meg (azaz nem intruziv).
Ha a binaris tarol debug infot, akkor a backtrace() hivassal ki tudod gyujteni a hivasi kontextust is. Gondolom ez a helyzet, mert kulonben az oprofile sem fog rajtad sokat segiteni (csak hexa cimeket fogsz latni).
(3) Ha egyikhez sincs kedved/lehetoseged, akkor ps -p
-L -o pid,tid hivogatasaval es parsolasaval is kinyerheted az infot. Nyilvan ez a rovid eletu szalakat nem fogja el.
- A hozzászóláshoz be kell jelentkezni
ha van solarisod
dtrace -n 'profile-3001:::/pid==$target/{@[ustack(7), tid]=count();}' -c programod
ha nincs akkor tanulmanyozd a -finstrument-functions gcc kapcsolot.
- A hozzászóláshoz be kell jelentkezni
solarison egy pstack-ből simán meg lehet mondani, hogy miért teker a program.
linuxon egy debuggerrel megállítod, kérsz minden threadről stack frame dumpot, és szintén lehet tudni.
persze, ha a program forrásához nincs hozzáférésed, akkor mérsékelten értelmes az egész...
- A hozzászóláshoz be kell jelentkezni
ha van nehany orad debuggerrel jatszani, es eleg stacktracet gyujteni vele, hogy atfogo keped legyen arrol, mivel is telik az ido, akkor igen, jo a debugger/pstack is. (linuxon is van pstack amugy, csak kicsit gagyi) ha nincs akkor a profile-3001-el 5mp alatt boven eleg infot gyujtesz. a debuggeres megoldasnal szerintem a kezi traceles -finstrument-functions-al is gyorsabb lesz.
- A hozzászóláshoz be kell jelentkezni
ha a cpu 100%-on pörög, miközben nem csinál érdemleges tevékenységet, ahhoz nem kell profiler, elég max. 2-3 db pstack. és a kérdező ezzel indított.
- A hozzászóláshoz be kell jelentkezni