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:



Debug console application z cmd.exe

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Debug console application z cmd.exe

Autor: Libor P.

16:04:43 23.02.2009

Velmi vám oběma ještě jednou děkuji. Není nad to narazit na dobré lidi :)

Citovat příspěvek

 

Re: Debug console application z cmd.exe

Autor: JiriValerian

21:10:23 13.02.2009

[color=#008000]Libor P. Napsal:
-------------------------------------------------------
> Jen mi nejak vrtalo hlavou, proc muzu primo
> debugovat DLLku, kterou loadne cizi proces (tak,
> ze tento proces nastavim jako ono Executable for
> debug session) ale nemuzu debugovat (muj) proces
> volany cizim procesem (tedy tim cmd.exe).[/color]

To je proto, že zatímco např. [b]consoleApp.exe/DLL[/b] je shodný proces,
tak v případě [b]CMD/consoleApp.exe[/b] tomu tak není a jedná se o jiný proces.

[color=#008000]> Problem je zcasti vyresen pouzitim DebugBreak().
> Pri reseni "pripichnuti k procesu" mi Visual
> Studio 6 akorat otevre nejaky prazdny projekt, ale
> netvari se, ze by se neco delo.[/color]

[size=20px][color=#000080][b]Mě to funguje takto:[/b][/color][/size]


V projektu konzolovky mám zdroják např. [b]Main.cpp[/b] obsahující toto:
[size=14px][code][color=#0000FF]#include[/color] [color=#800080][/color]

[color=#0000FF]int[/color] main [color=#800000]([/color][color=#0000FF]void[/color][color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]int[/color] a [color=#800000]=[/color] [color=#0000FF]5[/color][color=#800000];[/color]

getchar[color=#800000]([/color][color=#800000])[/color][color=#800000];[/color]

printf[color=#800000]([/color][color=#800080]"a = %d\n"[/color][color=#800000],[/color]a[color=#800000])[/color][color=#800000];[/color]

[color=#0000FF]return[/color] [color=#0000FF]0[/color][color=#800000];[/color]
[color=#800000]}[/color][/code][/size]

[b]1.[/b] Přeložím [b]Debug[/b] verzi programu a v podadresáři [b]Debug[/b] mi vznikne [b]consoleApp.exe[/b]


[b]2.[/b] Uzavřu projekt a [b]VC 6[/b] nechám spuštěno s tím, že v něm zatím nic není otevřeno.


[b]3.[/b] Z příslušného podadresáře [b]Debug[/b] spustím ručně:

[b]CMD /K consoleApp.exe[/b]

program se spustí v okně [b]CMD[/b] a zůstane viset v čekání na stisk klávesy.


[b]4.[/b] Nyní ve [b]VC 6[/b] zvolím
[code][color=#000080][b]Build[/b] ->
[b]Start Debug[/b] ->
[b]Attach to Process[/b] ->
a zvolím příslušný běžící proces [b]consoleApp[/b][/color][/code]
Po uzavření dialogu s výběrem procesu [b]VC 6[/b] zobrazí [b]disassembly[/b].


[b]5.[/b] Nyní ve [b]VC 6[/b] zvolím
[code][color=#000080][b]File[/b] ->
[b]Open[/b] ->
a na disku najdu zdroják [b]Main.cpp[/b], který je ve stejném
adresáři jako soubor projektu té konzolovky, ale soubor projektu neotvírám
tj. otvírám jen ten zdroják [b]Main.cpp[/b] tj. v okně výběru souboru
zvolím zdroják Main.cpp a kliknu na tlačítko [b]Otevřít[/b][/color][/code]
Visualko otevře okno toho zdrojáku [b]Main.cpp[/b] přičemž zůstává
stále napojeno na zvolený proces [b]consoleApp[/b].


[b]6.[/b] Nyní ve [b]VC 6[/b] z menu zvolím:
[code][color=#000080][b]Edit[/b] ->
[b]Breakpoints...[/b] ->
a v zobrazeném dialogu na záložce [b]Location[/b] do položky s popisem
[b]Break at:[/b] napíšu tečku a bezprostředně za ni číslo 9
[b].9[/b]
což je v daném případě číslo řádku ve zdrojáku kde je funkce [b]printf[/b]
a kam chci umístit breakpoint ->
dialog uzavřu tlačítkem [b]OK[/b][/color][/code]
Visualko mi po uzavření dialogu umístí na příslušný řádek v okně
s otevřeným zdrojákem breakpoint.


[b]7.[/b] Poté se přepnu do okna konzole spuštěného [b]CMD[/b] v němž stále čeká konzolovka
[b]consoleApp.exe[/b] na stisk klávesy a stisknu jen klávesu [b]Enter[/b].


[b]8.[/b] Poté se přepnu do okna [b]VC 6[/b] s otevřeným zdrojákem [b]Main.cpp[/b]
a vidím, že program je pozastaven na [b]řádku 9[/b] s nastaveným breakpointem.
Když v tom okně se zdrojákem ukážu kurzorem myši na název proměnné [b]a[/b]
tak se mi zobrazí [b]tool okýnko[/b] a v něm [b]název a hodnota proměnné[/b] viz obrázek.

[img]http://forum.builder.cz/file.php?108,file=558895[/img]


[color=#008000]> Kdyz necham konzolovku "spadnout" tim DebugBreak(),
> tak se mi nabidne k debugovani VS 2008 (ano, "vyhoda"
> vice Studii na jednom PC). Tam vidim zdrojak, krokuju
> ho, jen nejsem schopen se podivat do promenne nebo
> do pameti. Proc je to tak?[/color]

To, že se nepodíváte na proměnné bude nejspíš proto, že debugger z [b]VC 2008[/b] nepodporuje
debug symboly vytvořené starším překladačem při překladu té konzolovky ve [b]VC 6[/b].

Citovat příspěvek

 

Re[2]: Debug console application z cmd.exe

Autor: LadislavZezula

15:33:51 13.02.2009

> Problem je zcasti vyresen pouzitim DebugBreak(). Pri reseni
> "pripichnuti k procesu" mi Visual Studio 6 akorat otevre nejaky
> prazdny projekt, ale netvari se, ze by se neco delo. Kdyz necham
> konzolovku "spadnout" tim DebugBreak(), tak se mi nabidne k
> debugovani VS 2008 (ano, "vyhoda" vice Studii na jednom PC). Tam
> vidim zdrojak, krokuju ho, jen nejsem schopen se podivat do promenne nebo do pameti. Proc je to tak?

Sice jsem to s Visual Studiem primo nezkousel, ale jit by to melo.
Pokud to nejde, tak bych jako JIT debugger nastavil Windbg:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug
"Debugger"="c:\Program Files\Debugging Tools for Windows (x86)\windbg.exe"

Pokud to ani tak nepujde, mas moznost spustit cmd.exe pod debuggerem
Windbg, a zaskrtnout "Debug also child processes". Takto se windbg
zastavi u kazdeho podprocesu na tzv. initial breakpointu.
Takze az bude po zadani "neco | MyApp.exe | neco2" spusten tvuj
program, muzes zacit ladit.

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Debug console application z cmd.exe

Autor: Libor P.

8:52:05 13.02.2009

Diky vam obema za rady, urcite je vyzkousim co nejdriv.

Na co to potrebuju: moje konzolovka bude soucasti roury, takze muj zamer byl debugovat v podminkach co nejblizsich skutecnemu nasazeni. Ze pro debugovaci ucely nemusim volat:
neco | consoleApp.exe | neco2
ale muzu si pomoct napriklad ctenim ze souboru nebo z klavesnice, to vim.

Jen mi nejak vrtalo hlavou, proc muzu primo debugovat DLLku, kterou loadne cizi proces (tak, ze tento proces nastavim jako ono Executable for debug session) ale nemuzu debugovat (muj) proces volany cizim procesem (tedy tim cmd.exe).

Problem je zcasti vyresen pouzitim DebugBreak(). Pri reseni "pripichnuti k procesu" mi Visual Studio 6 akorat otevre nejaky prazdny projekt, ale netvari se, ze by se neco delo. Kdyz necham konzolovku "spadnout" tim DebugBreak(), tak se mi nabidne k debugovani VS 2008 (ano, "vyhoda" vice Studii na jednom PC). Tam vidim zdrojak, krokuju ho, jen nejsem schopen se podivat do promenne nebo do pameti. Proc je to tak?

(pouzivam Visty a na poli debugovani jsem novacek)

Citovat příspěvek

 

Re[4]: Debug console application z cmd.exe

Autor: LadislavZezula

8:57:05 12.02.2009

> Myslím, že pro zmíněný účel mu plně postačuje to co jsem popsal v bodě 1.
> tj. připojit se ke konzolovce z IDE přes Attach to Process. Může si dát
> na začátek mainu volání getchar() takže konzolovka bude v rámci cmd.exe
> čekat na stisk klávesy. On se pak připojí přes Attach to Process z Visualka,
> a v otevřeném projektu té konzolovky si v jejím zdrojáku nastaví breakpoint
> a pak v konzolovce stiskne klávesu pro pokračování, a to mu bude fungovat
> i když poběží ta konzolovka v rámci cmd.exe.

Pokud je Visual Studio nastavene jako just-in-time debugger
(coz normalne je), tak staci na zacatek ladeneho programu dat tvrdy
breakpoint (bud _asm int 3; nebo volani DebugBreak()). Pri spusteni z
konzole program "spadne", a windows nabidnou volbu "debug" a ten
attach se provede automaticky.

V podstate stejne jako to co jsi napsal, akorat malicko jednodussi.

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Re[2]: Debug console application z cmd.exe

Autor: JiriValerian

8:51:01 12.02.2009

[color=#008000]LadislavZezula Napsal:
-------------------------------------------------------
> ...Druhy zpusob, muj oblibeny, vyuziva kernel mode debugging,
> a pouzil bych jej pokud ten prvni selze, takze zatim nebudu
> popisovat detaily, protoze nastaveni je celkem slozite,
> pokud jsi to nikdy pred tim nedelal...[/color]

Myslím, že pro zmíněný účel mu plně postačuje to co jsem popsal v bodě [b]1.[/b]
tj. připojit se ke konzolovce z [b]IDE[/b] přes [b]Attach to Process[/b]. Může si dát
na začátek [b]mainu[/b] volání [b]getchar()[/b] takže konzolovka bude v rámci [b]cmd.exe[/b]
čekat na stisk klávesy. On se pak připojí přes [b]Attach to Process[/b] z [b]Visualka[/b],
a v otevřeném projektu té konzolovky si v jejím zdrojáku nastaví [b]breakpoint[/b]
a pak v konzolovce stiskne klávesu pro pokračování, a to mu bude fungovat
i když poběží ta konzolovka [b]v rámci cmd.exe[/b].

Citovat příspěvek

 

Re[2]: Debug console application z cmd.exe

Autor: LadislavZezula

8:22:56 12.02.2009

> Ale ja ji potrebuji spoustet z cmd.exe.

Docela by mne zajimal duvod proc, jedine co mne napada,
je ze tvoje aplikace testuje parent process a pokud to neni cmd.exe,
tak se ukonci.

Pokud vylozene potrebujes ladit process, ktery je primym potomkem
cmd.exe, pak znam dve moznosti. Prvni, ta jednodussi, vyuziva
vlastnosti systemu Windows NT (2000, XP, Vista) spustit proces daneho
cisteho jmena pod debuggerem. Potebujes k tomu utility gflags.exe
a windbg.exe, obe jsou soucasti Debugging Tools for Windows,
dostupne zadarmo na webu Microsoftu.

1) Spust utilitu gflags.exe
2) Klikni na zaloznu "Image File"
3) Do radku "Image (TAB to refresh)" napis jmeno tve aplikace BEZ
CESTY, tedy napriklad "MyApp.exe"
4) Tlacitkem TAB aktivujes volby na zalozce
5) Do pole "Debugger" napis PLNOU CESTU k souboru Windbg.exe,
tedy napr. "c:\Program Files\Debugging Tools for Windows (x86)\windbg.exe"
6) Potvrd klavesou OK.

Toto nastaveni zpusobi, ze kdykoliv spustis program, ktery se jmenuje
"MyApp.exe", z jakehokoliv adresare, tak system misto toho spusti
"c:\Program Files\Debugging Tools for Windows (x86)\windbg.exe
MyApp.exe parametry". Ve Windbg muzes pak ladit jak se ti zlibi.

Jedina nevyhoda tohoto zpusobu je ze tvuj proces vlastne neni
potomkem cmd.exe, coz muze a nemusi byt problem, v zavislosti
na tom proc to vlastne potebujes.

A samozrejme musis znat pouziti Windbg, ktery sice neni nijak slozity,
ale prece jen postrada komfort Visual Studia.

Druhy zpusob, muj oblibeny, vyuziva kernel mode debugging,
a pouzil bych jej pokud ten prvni selze, takze zatim nebudu
popisovat detaily, protoze nastaveni je celkem slozite,
pokud jsi to nikdy pred tim nedelal.

L.



Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Debug console application z cmd.exe

Autor: JiriValerian

8:05:03 12.02.2009

[color=#008000]Libor P. Napsal:
-------------------------------------------------------
> Ale ja ji potrebuji spoustet z cmd.exe.[/color]

V tom případě nemůžete provádět debugování přímo a máte v podstatě dvě možnosti.


[b]1.[/b] Spustit aplikaci z podadresáře [b]Debug[/b] ručně mimo prostředí [b]VC 6[/b]
a k již běžící konzolové aplikaci [b]consoleApp.exe[/b] se připojit k již běžícímu procesu.

Při otevřeném projektu té konzolovky zvolit z menu [b]IDE VC 6[/b]:

[code][b][color=#000080]Build ->
Start Debug ->
Attach to Process ->
a zvolit příslušný běžící proces vaší konzolovky[/color][/b][/code]

[b]2.[/b] Nebo si namísto přímého debugování udělat v programu nějaké zápisy stavů
a průchodů programu různými místy do souboru a ten pak vyhodnotit. To se používá
v případech kdy z nějakých důvodů není vhodné debugovat přímo.


Jinou možnost neznám.

Citovat příspěvek

 

Re: Debug console application z cmd.exe

Autor: Libor P.

7:48:01 12.02.2009

Ale ja ji potrebuji spoustet z cmd.exe.

Citovat příspěvek

 

Re: Debug console application z cmd.exe

Autor: JiriValerian

22:01:41 07.02.2009

[color=#008000]Libor P. Napsal:
-------------------------------------------------------
> Dobry den, pri debugovani console application
> volane z cmd.exe mi Visual Studio 6 ignoruje
> breakpointy.
>
> V nastaveni projektu mam na zalozce Debug toto:
>
> Executable for debug session:
>
> c:\windows\system32\cmd.exe
>
> Working directory:
>
> C:\consoleApp\Debug\
>
> Program arguments:
>
> /K "consoleApp.exe"
> (toto je parametr cmd.exe pro spusteni
> debugovaciho exe)
>
> Remote executable path and file name:
>
> C:\windows\system32\cmd.exe
>
> V Process explorer vidim, ze moje consoleApp.exe
> je zavolana procesem cmd.exe a ten patri procesu
> MSDEV.EXE. Pritom Visual Studio ignoruje moje
> breakpointy.
>
> Poradi mi prosim nekdo?[/color]

Problém je v tom, že tu konzolovku spouštíte přes cmd.exe.
Musíte ji spustit v Debugu přímo z Visualka a ne přes cmd.exe.

Citovat příspěvek

 

Debug console application z cmd.exe

Autor: Libor P.

15:29:33 07.02.2009

Dobry den, pri debugovani console application volane z cmd.exe mi Visual Studio 6 ignoruje breakpointy.

V nastaveni projektu mam na zalozce Debug toto:

Executable for debug session:

c:\windows\system32\cmd.exe

Working directory:

C:\consoleApp\Debug\

Program arguments:

/K "consoleApp.exe"
(toto je parametr cmd.exe pro spusteni debugovaciho exe)

Remote executable path and file name:

C:\windows\system32\cmd.exe

V Process explorer vidim, ze moje consoleApp.exe je zavolana procesem cmd.exe a ten patri procesu MSDEV.EXE. Pritom Visual Studio ignoruje moje breakpointy.

Poradi mi prosim nekdo?

Citovat příspěvek

 

 

 

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

Uživatelské jméno:

Heslo: