Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma obsahuje seznam všech přípravných kroků, které mohou být vyžadovány před laděním aplikace služby. Které kroky se ve vašem scénáři vyžadují, závisí na tom, jakou možnost připojení jste zvolili a jakou konfiguraci ladění jste zvolili. Seznam těchto možností najdete v tématu Volba nejlepší metody ladění aplikace služby.
Každý přípravný postup popsaný v tomto tématu určuje podmínky, za kterých se vyžaduje. Tyto kroky je možné provést v libovolném pořadí.
Povolení Ladění Inicializačního Kódu
Pokud plánujete ladit aplikaci služby od začátku jejího spuštění, včetně inicializačního kódu, je tento přípravný krok povinný.
Vyhledejte nebo vytvořte následující klíč registru, kde ProgramName je název spustitelného souboru aplikace služby:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProgramName
ProgramName by měl obsahovat příponu názvu souboru, ale ne cestu. Například ProgramName může být Myservice.exe nebo Thisservice.dll.
Pod tímto klíčem registru vytvořte hodnotu řetězcových dat s názvem Debugger. Hodnota tohoto řetězce by měla být nastavena na úplnou cestu a název souboru ladicího programu, který se má připojit k aplikaci služby.
Pokud plánujete ladit lokálně, použijte řetězec například jako následující:
c:\Debuggers\windbg.exeTuto možnost nevybírejte, pokud používáte Systém Windows Vista nebo novější verzi Systému Windows.
Pokud plánujete používat vzdálené ladění, zadejte NTSD s možností -noio. To způsobí, že NTSD se spustí bez vlastní konzoly, která je přístupná pouze prostřednictvím vzdáleného připojení. Například:
c:\Debuggers\ntsd.exe -server ServerTransport -noio -y SymbolPathPokud relace ladění začíná před úplným načtením systému Windows, možná nebudete mít přístup ke symbolům ze vzdáleného sdílení. V takovém případě musíte použít místní symboly. ServerTransport musí určit přenosový protokol, který je implementován jádrem Windows bez propojení se službou v uživatelském režimu, jako je TCP nebo NPIPE. Pro syntaxi ServerTransportviz Aktivace ladění serveru.
Pokud chcete řídit ladicí program v uživatelském režimu z ladicího programu v režimu jádra, zadejte NTSD s možností -d. Například:
c:\Debuggers\ntsd.exe -d -y SymbolPathPokud plánujete použít tuto metodu a symboly uživatelského režimu budou přístupné ze serveru symbolů, měli byste tuto metodu kombinovat se vzdáleným laděním. V tomto případě zadejte NTSD s možností -ddefer. Zvolte přenosový protokol, který je implementován jádrem Windows bez propojení se službou v uživatelském režimu, jako je TCP nebo NPIPE. Například:
c:\Debuggers\ntsd.exe -server ServerTransport -ddefer -y SymbolPathPodrobnosti naleznete v části Řízení ladicího programu User-Mode z ladicího programu jádra.
Po dokončení této úpravy registru se ladicí program spustí při každém spuštění nebo restartování služby s tímto názvem.
Povolení aplikace služby k vstupu do ladicího programu
Pokud chcete, aby aplikace služby při chybě nebo výjimce přešla do ladicího programu, je tento přípravný krok nezbytný. Tento krok se vyžaduje také v případě, že chcete, aby aplikace služby vstoupila do ladicího programu voláním funkce DebugBreak.
Poznámka Pokud jste povolili ladění inicializačního kódu (krok popsaný v pododdílu "Povolení ladění inicializačního kódu"), měli byste tento krok přeskočit. Pokud je povoleno ladění kódu inicializace, ladicí program se připojí k aplikaci služby, když se spustí, což způsobí, že všechna selhání, výjimky a volání DebugBreak jsou směřovány do ladicího programu bez nutnosti dalších příprav.
Tento přípravný krok zahrnuje registraci zvoleného ladicího programu jako ladicí program postmortem. To se provádí pomocí -iae nebo -iaec možností na příkazovém řádku ladicího programu. Doporučujeme tyto příkazy, ale pokud je chcete změnit, pro podrobnosti o syntaxi se podívejte do Povolení ladění postmortem.
Pokud plánujete ladit místně, použijte například následující příkaz:
windbg -iaeTuto možnost nevybírejte, pokud používáte Systém Windows Vista nebo novější verzi Systému Windows.
Pokud plánujete používat vzdálené ladění, zadejte NTSD s možností -noio. To způsobí, že NTSD se spustí bez vlastní konzoly, která je přístupná pouze prostřednictvím vzdáleného připojení. Chcete-li nainstalovat ladicí program postmortem, který obsahuje parametr -server, je nutné ručně upravit registr; podrobnosti najdete v tématu Povolení ladění postmortem. Například hodnota Debuggeru klíče AeDebug může být následující:
ntsd -server npipe:pipe=myproc%x -noio -p %ld -e %ld -g -y SymbolPathVe specifikaci kanálu je token %x nahrazen ID procesu, který spustí ladicí program. To zaručuje, že pokud několik procesů spustí ladicí program postmortem, každý z nich má jedinečné jméno pro komunikační kanál. Pokud relace ladění začíná před úplným načtením systému Windows, možná nebudete mít přístup ke symbolům ze vzdáleného sdílení. V takovém případě musíte použít místní symboly. ServerTransport musí určit přenosový protokol, který je implementován jádrem Windows bez propojení se službou v uživatelském režimu, jako je TCP nebo NPIPE. Pro syntaxi ServerTransportviz Aktivace ladění serveru.
Pokud chcete řídit ladicí program v uživatelském režimu z ladicího programu v režimu jádra, zadejte NTSD s možností -d. Například:
ntsd -iaec -d -y SymbolPathPokud zvolíte tuto metodu a chcete získat přístup k symbolům uživatelského režimu ze serveru symbolů, měli byste tuto metodu kombinovat se vzdáleným laděním. V tomto případě zadejte NTSD s možností -ddefer. Zvolte přenosový protokol, který je implementován jádrem Windows bez propojení se službou v uživatelském režimu, jako je TCP nebo NPIPE. Chcete-li nainstalovat ladicí program postmortem, který obsahuje parametr -server, je nutné ručně upravit registr; podrobnosti najdete v tématu Povolení ladění postmortem. Například hodnota Debuggeru klíče AeDebug může být následující:
ntsd -server npipe:pipe=myproc%x -ddefer -p %ld -e %ld -g -y SymbolPathPodrobnosti naleznete v části Řízení ladicího programu User-Mode z ladicího programu jádra.
Když vydáte jeden z těchto příkazů, zaregistruje se ladicí program postmortem. Tento ladicí program se spustí vždy, když jakýkoli program v uživatelském režimu, včetně aplikace služby, narazí na výjimku nebo spustí funkci DebugBreak.
úprava časového limitu aplikace služby
Pokud plánujete spustit ladicí program automaticky (buď při spuštění služby, nebo když dojde k výjimce), je tento přípravný krok nutný.
Vyhledejte následující klíč registru:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
V tomto klíči vyhledejte nebo vytvořte datovou hodnotu DWORD s názvem ServicesPipeTimeout. Nastavte tuto položku na dobu v milisekundách, po kterou má služba čekat před vypršením časového limitu. Například hodnota 60 000 je jedna minuta, zatímco hodnota 86 400 000 je 24 hodin. Pokud tato hodnota registru není nastavená, výchozí časový limit je asi třicet sekund.
Význam této hodnoty spočívá v tom, že se s každým spuštěním služby začne měřit čas a při dosažení hodnoty časového limitu je ukončen jakýkoli ladicí program připojený ke službě. Hodnota, kterou zvolíte, by proto měla být delší než celková doba, která uplyne mezi spuštěním služby a dokončením relace ladění.
Toto nastavení platí pro každou službu, která je spuštěna nebo restartována po dokončení úprav registru. Pokud se některá služba zhroutí nebo přestane reagovat a toto nastavení je stále v platnosti, systém Windows problém nezjistí. Proto byste toto nastavení měli použít pouze při ladění a po dokončení ladění vrátit klíč registru k původní hodnotě.
Izolování služby
V některých případech se v jednom procesu hostitele služeb (Svchost) zkombinuje více služeb. Pokud chcete takovou službu ladit, musíte ji nejprve izolovat do samostatného procesu typu Svchost.
Existují tři metody, pomocí kterých můžete službu izolovat. Společnost Microsoft doporučuje přesunout službu do vlastní skupiny následujícím způsobem. Alternativní metody (změna typu služby a duplikování binárního souboru SvcHost) lze použít na dočasném základě pro ladění, ale protože mění způsob spouštění služby, nejsou tak spolehlivé jako první metoda.
upřednostňovaná metoda : Přesun služby do vlastní skupiny
Zadejte následující příkaz service Configuration tool (Sc.exe), kde ServiceName je název služby:
sc qc ServiceNameZobrazí se aktuální hodnoty konfigurace pro službu. Hodnota zájmu je BINARY_PATH_NAME, která určuje příkazový řádek použitý ke spuštění programu řízení služby. V tomto scénáři, protože vaše služba ještě není izolovaná, tento příkazový řádek obsahuje cestu k adresáři, Svchost.exea některé parametry SvcHost, včetně přepínače -k následované názvem skupiny. Může to vypadat například takto:
%SystemRoot%\System32\svchost.exe -k LocalServiceNoNetworkZapamatujte si tuto cestu a název skupiny; používají se v krocích 5 a 6.
Vyhledejte následující klíč registru:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHostVytvořte novou hodnotu REG_MULTI_SZ s jedinečným názvem (například TempGrp).
Nastavte tuto novou hodnotu na název služby, kterou chcete izolovat. Nezahrnujte žádnou cestu k adresáři ani příponu názvu souboru. Můžete například nastavit novou hodnotu TempGrp rovna MyService.
Pod stejným klíčem registru vytvořte nový klíč se stejným názvem, který jste použili v kroku 2. Například:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost\TempGrpTeď klíč SvcHost obsahuje hodnotu s novým názvem a má také podřízený klíč se stejným názvem.
Vyhledejte další podřízený klíč klíči SvcHost, který má stejný název jako skupina, kterou jste našli v kroku 1. Pokud takový klíč existuje, prozkoumejte všechny hodnoty v něm a vytvořte duplicity z nich v novém klíči, který jste vytvořili v kroku 4.
Starý klíč může mít například tento název:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost\LocalServiceNoNetworka může obsahovat hodnoty, jako jsou CoInitializeSecurityParam, AuthenticationCapabilitiesa další hodnoty. Přejdete na nově vytvořený klíč:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SvcHost\TempGrpa vytvořte v něm hodnoty, které jsou identické v názvu, typu a data s hodnotami ve starém klíči.
Pokud starý klíč neexistuje, nemusíte vytvářet nový klíč.
Ke změně cesty nalezené v kroku 1 použijte následující příkaz nástroje Konfigurace služby:
sc config ServiceName binPath= "RevisedPath"V tomto příkazu ServiceName je název služby a RevisedPath je nová hodnota, kterou pro BINARY_PATH_NAME zadáte. Pro RevisedPathpoužijte stejnou cestu jako v kroku 1, včetně všech možností zobrazených na tomto řádku, a proveďte pouze jednu změnu: nahraďte parametr za přepínačem -k názvem nové hodnoty registru, kterou jste vytvořili v kroku 2. Vložte RevisedPath do uvozovek. Mezera za symbolem rovná se vyžaduje.
Váš příkaz může vypadat například takto:
sc config MyService binPath= "%SystemRoot%\System32\svchost.exe -k TempGrp"Ke kontrole provedené změny můžete znovu použít příkaz sc qc.
Tato nastavení se projeví při příštím spuštění služby. Pokud chcete vymazat účinky staré služby, doporučujeme restartovat systém Windows, nikoli jenom restartovat službu.
Po dokončení ladění, pokud chcete vrátit tuto službu hostiteli sdílené služby, použijte znovu příkaz sc config vrátit binární cestu k původní hodnotě a odstranit nové klíče registru a hodnoty, které jste vytvořili..
alternativní metoda : Změna typu služby
Zadejte následující příkaz service Configuration tool (Sc.exe), kde ServiceName je název služby:
sc config ServiceName type= ownMezera za symbolem rovná se vyžaduje.
Restartujte službu pomocí následujících příkazů:
net stop ServiceName net start ServiceName
Tato alternativa není doporučená metoda, protože může změnit chování služby. Pokud použijete tuto metodu, pomocí následujícího příkazu se po dokončení ladění vraťte k normálnímu chování:
sc config ServiceName type= share
Alternativní metoda : Duplikování binárního SvcHost
Spustitelný soubor Svchost.exe se nachází v adresáři system32 systému Windows. Vytvořte kopii tohoto souboru, pojmenujte ho svhost2.exea umístěte ho také do adresáře system32.
Zadejte následující příkaz service Configuration tool (Sc.exe), kde ServiceName je název služby:
sc qc ServiceNameTento příkaz zobrazí aktuální hodnoty konfigurace pro službu. Hodnota zájmu je BINARY_PATH_NAME, která určuje příkazový řádek použitý ke spuštění programu řízení služby. V tomto scénáři, protože vaše služba ještě není izolovaná, bude tento příkazový řádek obsahovat cestu k adresáři, Svchost.exea pravděpodobně některé parametry SvcHost. Může to vypadat například takto:
%SystemRoot%\System32\svchost.exe -k LocalServiceNoNetworkPokud chcete tuto cestu upravit, zadejte následující příkaz:
sc config ServiceName binPath= "RevisedPath"V tomto příkazu ServiceName je název služby a RevisedPath je nová hodnota, kterou pro BINARY_PATH_NAME zadáte. Pro RevisedPathpoužijte stejnou cestu jako v kroku 2, včetně všech možností zobrazených na tomto řádku, a proveďte pouze jednu změnu: nahraďte Svchost.exe Svchost2.exe. Vložte RevisedPath do uvozovek. Mezera za symbolem rovná se vyžaduje.
Váš příkaz může vypadat například takto:
sc config MyService binPath= "%SystemRoot%\System32\svchost2.exe -k LocalServiceNoNetwork"Ke kontrole provedené změny můžete znovu použít příkaz sc qc.
Restartujte službu pomocí následujících příkazů:
net stop ServiceName net start ServiceName
Tato alternativa není doporučená metoda, protože může změnit chování služby. Pokud použijete tuto metodu, po dokončení ladění změňte cestu zpět na původní hodnotu pomocí příkazu sc config.