Rostoucí uznání Microsoftu pro Linux a open source není žádným tajemstvím. Společnost v posledních několika letech neustále zvyšovala své příspěvky k open source, včetně portování některého svého softwaru a nástrojů na Linux. Koncem roku 2018 společnost Microsoft oznámila, že přenáší některé ze svých nástrojů Sysinternals do Linuxu jako open source a ProcDump pro Linux byla první taková verze.
Pokud jste pracovali na Windows při ladění nebo odstraňování problémů, pravděpodobně jste slyšeli o Sysinternals. Jedná se o sadu nástrojů „švýcarský nůž“, která pomáhá systémovým administrátorům, vývojářům a odborníkům na bezpečnost IT monitorovat a odstraňovat problémy v prostředí Windows.
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Jedním z nejoblíbenějších nástrojů Sysinternals je ProcDump. Jak jeho název napovídá, používá se k ukládání paměti běžícího procesu do souboru jádra na disku. Tento základní soubor lze poté analyzovat pomocí ladicího programu, aby bylo možné porozumět stavu procesu, kdy byl uložen výpis. Vzhledem k tomu, že jsem dříve používal Sysinternals, chtěl jsem vyzkoušet linuxový port ProcDump.
Začínáme s ProcDump pro Linux
Chcete-li vyzkoušet ProcDump pro Linux, musíte si tento nástroj stáhnout a zkompilovat. (Používám Red Hat Enterprise Linux, i když tyto pokyny by měly fungovat stejně na jiných distribucích Linuxu):
$ cat /etc/redhat-release
Red Hat Enterprise Linux verze 8.2 (Ootpa)
$
$ uname -r
4.18.0-193.el8.x86_64
$
Nejprve naklonujte úložiště ProcDump pro Linux:
$ git klon https://github.com/microsoft/ProcDump-for-Linux.git
Klonování do 'ProcDump-for-Linux'...
vzdálené:Výčet objektů:40, hotovo.
dálkové:Počítání objektů:100 % (40/40), hotovo.
dálkové ovládání:Komprese objektů:100 % (33/33), hotovo.
dálkové ovládání:Celkem 414 (delta 14), znovu použito 14 (delta 6), znovu použít 374
Příjem objektů:100 % (414/414), 335,28 KiB | 265,00 kiB/s, hotovo.
Rozlišení rozdílů:100 % (232/232), hotovo.
$
$ cd ProcDump-for-Linux/
$
$ ls
azure-pipelines.yml CONTRIBUTING.md docs INSTALL.md Makefile procdump.gif src
CODE_OF_CONDUCT.md testy dist < < < dDále sestavte program pomocí make
. Vytiskne přesné rozhraní příkazového řádku GCC potřebné ke kompilaci zdrojových souborů:$ make
rm -rf obj
rm -rf bin
rm -rf /root/ProcDump-for-Linux/pkgbuild
gcc -c -g -o obj /Logging.o src/Logging.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/Events.o src/Events.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/ProcDumpConfiguration.o src/ProcDumpConfiguration.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g - o obj/Handle.o src/Handle.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/Process.o src/Process.c -Wall -I . /include -pthread -std=gnu99
gcc -c -g -o obj/Procdump.o src/Procdump.c -Wall -I ./include -pthread -std=gnu99
gcc -c - g -o obj/TriggerThreadProcs.o src/TriggerThreadProcs.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/CoreDumpWriter.o src/CoreDumpWriter.c -Wall - I ./include -pthread -std=gnu99
gcc -o bin/procdump obj/Logging.o obj/Events.o obj/ProcDumpConfiguration.o obj/Handle.o obj/Process.o obj/Procdump.o obj/TriggerThreadProcs.o obj/CoreDumpWriter.o -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/ProcDumpTestApplication.o testy/integration/ProcDumpTestApplication.c -Wall -I ./include -pthread -std=gnu99
gcc -o bin/ProcDumpTestApplication obj/ProcDumpTestApplication.o -Wall -I ./include -pthread -std=gnu99
$Kompilace vytvoří dva nové adresáře. První je
obj/
adresář, který obsahuje soubory objektů vytvořené během kompilace. Druhý (a důležitější) adresář jebin/
, kde je zkompilovanýprocdump
program je uložen. Kompiluje také další testovací binární soubor s názvemProcDumpTestApplication
:$ ls obj/
CoreDumpWriter.o Handle.o ProcDumpConfiguration.o ProcDumpTestApplication.o TriggerThreadProcs.o
Events.o < Logging.o Proces. / Proces Procdump.>$
$ ls bin/
procdump ProcDumpTestApplication
$
$ soubor bin/procdump
bin/procdump:ELF 64bitový spustitelný soubor LSB, x86-64, verze 1 (SYSV), dynamicky propojený, interpret /lib64/ld-linux-x86-64.so.2, pro GNU/Linux 3.2.0, BuildID[sha1]=6e8827db64835ea0d1f0941ac3ecff9ee8c06e6b, bez odladění br />$ soubor bin/ProcDumpTestApplication
bin/ProcDumpTestApplication:ELF 64bitový spustitelný soubor LSB, x86-64, verze 1 (SYSV), dynamicky propojený, interpret /lib64/ld-linux-x86-64.so. 2, pro GNU/Linux 3.2.0, BuildID[sha1]=c8fd86f53c07df142e52518815b2573d1c690e4e, s debug_info, neodstraněno
$S tímto nastavením pokaždé, když spustíte
procdump
musíte se přesunout dobin/
složka. Chcete-li jej zpřístupnit odkudkoli v systému, spusťtemake install
. Toto zkopíruje binární soubor do obvykléhobin/
adresář, který je součástí$PATH
vašeho shellu :$ který procdump
/usr/bin/which:žádný procdump v (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
$
$ make install
mkdir -p //usr/bin
cp bin/procdump //usr/bin
mkdir -p //usr/share/man/man1
cp procdump.1 //usr/share/man/man1
$
$ který procdump
/usr/bin/procdump
$Při instalaci poskytuje ProcDump manuálovou stránku, ke které můžete přistupovat pomocí
man procdump
:$ man procdump
$Spustit ProcDump
Chcete-li vypsat paměť procesu, musíte zadat jeho ID procesu (PID) do ProcDump. Na svém počítači můžete použít jakýkoli ze spuštěných programů nebo démonů. Pro tento příklad použiji malý program v C, který se věčně zacyklí. Zkompilujte program a spusťte jej (pro ukončení programu stiskněte Ctrl +C , nebo pokud běží na pozadí, použijte
kill
příkaz s PID):$ cat progxyz.c
#include
int main() {
for (;;)
{
printf(".");
sleep(1);
}
return 0;
}
$
$ gcc progxyz.c -o progxyz
$
$ ./progxyz &
[1] 350498
$Spuštěním programu můžete zjistit jeho PID buď pomocí
pgrep
nebops
. Poznamenejte si PID:$ pgrep progxyz
350498
$
$ ps -ef | grep progxyz
kořen 350498 345445 0 03:29 pts/1 00:00:00 ./progxyz
kořen p 350508 350508 350508 350508 350508 3473350 0 0 =auto z 0:0 0 0
$Zatímco testovací proces běží, vyvolejte
procdump
a uveďte PID. Výstup uvádí název procesu a PID, hlásíCore dump
byl vygenerován a zobrazuje název souboru:$ procdump -p 350498
ProcDump v1.1.1 – Nástroj pro výpis stavu procesu Sysinternals
Copyright (C) 2020 Microsoft Corporation. Všechna práva vyhrazena. Licencováno pod licencí MIT.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitoruje proces a zapisuje soubor výpisu, když proces překročí
zadaná kritéria.
Proces: progxyz (350498)
Práh CPU: n/a
Práh potvrzení: n/a
Interval dotazování (ms):1 0 (thre):1 />1000
Počet výpisů: 1
Stisknutím Ctrl-C ukončíte sledování bez ukončení procesu.
[03:30:00 - INFO]:Časově:
[03:30:01 - INFO]:Výpis jádra 0 vygenerován:progxyz_time_2020-06-24_03:30:00.350498
$Vypište obsah aktuálního adresáře a měli byste vidět nový soubor jádra. Název souboru odpovídá názvu zobrazenému v
procdump
příkaz a je k němu připojeno datum, čas a PID:$ ls -l progxyz_time_2020-06-24_03\:30\:00.350498
-rw-r--r--. 1 kořenový kořenový adresář 356848 24. června 03:30 progxyz_time_2020-06-24_03:30:00.350498
$
$ soubor progxyz_time_2020-06-24_03\:30 20_48-02_04 30:00.350498:ELF 64bitový soubor jádra LSB, x86-64, verze 1 (SYSV), styl SVR4, z './progxyz', skutečné uid:0, skutečné uid:0, skutečné gid:0, účinné gid :0, execfn:'./progxyz', platforma:'x86_64'
$Analyzujte základní soubor pomocí GNU Project Debugger
Chcete-li zjistit, zda můžete číst soubor proc, spusťte GNU Project Debugger (
gdb
). Nezapomeňte uvést cestu testovací binární sady, abyste viděli všechny názvy funkcí v zásobníku. Zdebt
(backtrace) ukazuje, žesleep()
funkce se spouštěla, když byl uložen výpis:$ gdb -q ./progxyz ./progxyz_time_2020-06-24_03\:30\:00.350498
Čtení symbolů z ./progxyz...(nenalezeny žádné symboly ladění)...hotovo.
[Nové LWP 350498]
Jádro bylo vygenerováno pomocí `./progxyz'.
#0 0x00007fb6947e9208 v nanosleep () z /lib64/libc.so.6
Chybějící samostatné informace o ladění, použijte:yum debuginfo-install glibc-2.28-101.el8.x86_64
(gdb) bt
#0 0x00007fb6947e9208 v nanosleep () z /lib64/libc.so.6
#1 70x0000 spánku () z /lib64/libc.so.6
#2 0x00000000004005f3 v hlavním ()
(gdb)A co gcore?
Uživatelé Linuxu budou rychle poukazovat na to, že Linux již má příkaz nazvaný
gcore
, který se dodává s většinou linuxových distribucí a dělá přesně to samé jako ProcDump. Toto je platný argument. Pokud jste jej nikdy nepoužili, vyzkoušejte následující postup pro výpis jádra procesu pomocígcore
. Spusťte znovu testovací program a poté spusťtegcore
a zadejte PID jako argument:$ ./progxyz &
[1] 350664
$
$
$ pgrep progxyz
350664
$
$
$ gcore 350664
0x00007fefd3be2208 v nanosleep () z /lib64/libc.so.6
Uložené jádro souboru core.350664
[Inferior 1 (proces 350664>) odpojeno]
gcore
vypíše zprávu o uložení jádra do konkrétního souboru. Zkontrolujte aktuální adresář, abyste našli tento základní soubor, a použijtegdb
znovu jej načíst:$
$ ls -l core.350664
-rw-r--r--. 1 kořenový kořenový adresář 356848 24. června 03:34 core.350664
$
$
$ file core.350664
core.350664:ELF 64bitový soubor jádra LSB, x86-64 , verze 1 (SYSV), styl SVR4, z './progxyz', skutečné uid:0, účinné uid:0, skutečné gid:0, účinné gid:0, execfn:'./progxyz', platforma:'x86_64 '
$
$ gdb -q ./progxyz ./core.350664
Čtení symbolů z ./progxyz...(nenalezeny žádné symboly ladění)...hotovo.
[Nový LWP 350664]
Jádro vygeneroval `./progxyz'.
#0 0x00007fefd3be2208 v nanosleep () z /lib64/libc.so.6
Chybí samostatné informace o ladění, použijte:yum debuginfo-install glibc-2.28-101.el8.x86_64
(gdb) bt
#0 0x00007fefd3be2208 v nanosleep () z /lib64/libc.so.6
#1 0x000007fefd3 ) z /lib64/libc.so.6
#2 0x00000000004005f3 v hlavním ()
(gdb) q
$Pro
gcore
Chcete-li pracovat, musíte se ujistit, že jsou na místě následující nastavení. Nejprve zkontrolujteulimit
je nastaven pro základní soubory; pokud je nastaveno na0
, základní soubory nebudou generovány. Za druhé se ujistěte, že/proc/sys/kernel/core_pattern
má správná nastavení pro určení vzoru jádra:$ ulimit -c
neomezeno
$Měli byste používat ProcDump nebo gcore?
Existuje několik případů, kdy byste mohli raději používat ProcDump místo gcore, a ProcDump má několik vestavěných funkcí, které mohou být obecně užitečné.
Čekání na spuštění testovacího binárního souboru
Ať už používáte ProcDump nebo gcore, testovací proces musí být proveden a v běžícím stavu, abyste mohli zadat PID pro vygenerování souboru jádra. Ale ProcDump má funkci, která čeká, dokud se nespustí konkrétní binární soubor; jakmile najde běžící testovací binární soubor, který odpovídá danému názvu, vygeneruje základní soubor pro tento testovací binární soubor. Lze jej povolit pomocí
-w
argument a název programu místo PID. Tato funkce může být užitečná v případech, kdy se testovací program rychle ukončí.Zde je návod, jak to funguje. V tomto příkladu neexistuje žádný proces s názvem
progxyz
běží:$ pgrep progxyz
$Vyvolejte
procdump
pomocí-w
příkaz nechat čekat. Z jiného terminálu vyvolejte testovací binární souborprogxyz
:$ procdump -w progxyz
ProcDump v1.1.1 – Nástroj pro výpis stavu procesu Sysinternals
Copyright (C) 2020 Microsoft Corporation. Všechna práva vyhrazena. Licencováno pod licencí MIT.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitoruje proces a zapisuje soubor výpisu, když proces překročí
zadaná kritéria.
Proces: progxyz (nevyřízeno)
Práh CPU: n/a
Práh potvrzení: n/a
Interval dotazování (ms): 1000
Počet výpisů: 1
Stisknutím Ctrl-C ukončíte sledování bez ukončení procesu.
[03:39:23 - INFO]:Čekání na proces 'progxyz' ke spuštění...Poté z jiného terminálu vyvolejte testovací binární soubor
progxyz
:$ ./progxyz &
[1] 350951
$ProcDump okamžitě zjistí, že je binární soubor spuštěn, a vypíše hlavní soubor pro tento binární soubor:
[03:39:23 - INFO]:Čekání na spuštění procesu 'progxyz'...
[03:43:22 - INFO]:Nalezen proces s PID 350951
[03:43:22 - INFO]:Časově:
[03:43:23 - INFO]:Výpis jádra 0 vygenerován:progxyz_time_2020-06-24_03:43:22.350951
$
$ ls -l progxyz_time_2020-06-24_03\:43\:22.350951
-rw-r--r--. 1 kořenový kořenový adresář 356848 24. června 03:43 progxyz_time_2020-06-24_03:43:22.350951
$
$ soubor progxyz_time_2020-06-24_03\:45 06-952-03\:45 0952-02.3 43:22.350951:ELF 64bitový soubor jádra LSB, x86-64, verze 1 (SYSV), styl SVR4, z './progxyz', skutečné uid:0, skutečné uid:0, skutečné gid:0, účinné gid :0, execfn:'./progxyz', platforma:'x86_64'
$Vícenásobné výpisy jádra
Další důležitou funkcí ProcDump je, že můžete určit, kolik základních souborů se má vygenerovat, pomocí argumentu příkazového řádku
-n <count>
. Výchozí časová mezera mezi výpisy jádra je 10 sekund, ale můžete to změnit pomocí-s <sec>
argument. Tento příklad používá ProcDump k provedení tří výpisů jádra testovacího binárního souboru:$ ./progxyz &
[1] 351014
$
$ procdump -n 3 -p 351014
ProcDump v1.1.1 – Nástroj pro výpis procesu Sysinternals
Autorská práva (C) 2020 Microsoft Corporation. Všechna práva vyhrazena. Licencováno pod licencí MIT.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitoruje proces a zapisuje soubor výpisu, když proces překročí
zadaná kritéria.
Proces: progxyz (351014)
Práh CPU: n/a
Práh potvrzení: n/a
Interval dotazování (ms):1 0 (thre):1 />1000
Počet výpisů: 3
Stisknutím Ctrl-C ukončíte sledování bez ukončení procesu.
[03:45:20 - INFO]:Časově:
[03:45:21 - INFO]:Výpis jádra 0 vygenerován:progxyz_time_2020-06-24_03:45:20.351014
[03:45:31 - INFO]:Časově:
[03:45:32 - INFO]:Výpis jádra 1 vygenerován:progxyz_time_2020-06-24_03:45:31.351014
[03:45:42 - INFO]:Časově:
[03:45:44 - INFO] :Výpis jádra 2 vygenerován:progxyz_time_2020-06-24_03:45:42.351014
$
$ ls -l progxyz_time_2020-06-24_03\:45\:*
-rw-r--r --. 1 kořenový kořen 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:20.351014
-rw-r--r--. 1 kořenový kořen 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:31.351014
-rw-r--r--. 1 kořenový kořen 356848 24. června 03:45 progxyz_time_2020-06-24_03:45:42.351014
$Výpis jádra na základě využití CPU a paměti
ProcDump také umožňuje spustit výpis jádra, když testovací binární soubor nebo proces dosáhne určité prahové hodnoty CPU nebo paměti. Manuálová stránka ProcDumpu zobrazuje argumenty příkazového řádku, které se mají použít při vyvolání ProcDump:
-C Spustit generování výpisu jádra, když CPU překročí nebo se rovná zadané hodnotě (0 až 100 * nCPU)
-c Spustit generování výpisu jádra, když je CPU menší než zadaná hodnota (0 až 100 * nCPU)
-M Spustit generování výpisu jádra, když paměť překročí nebo se rovná zadané hodnotě (MB)
-m Spustí generování výpisu jádra, když je potvrzení paměti menší než zadaná hodnota (MB)
-T Spustí při počtu vláken překročí nebo se rovná zadané hodnotě.
-F Spustí se, když počet deskriptorů souborů překročí nebo se rovná zadané hodnotě.
-I Frekvence dotazování v milisekundách (výchozí je 1000)Můžete například požádat ProcDump o výpis jádra, když využití CPU daného PID překročí 70 %:
procdump -C 70 -n 3 -p 351014
Závěr
ProcDump je zajímavým doplňkem k dlouhému seznamu programů pro Windows portovaných na Linux. Nejen, že uživatelům Linuxu poskytuje další možnosti nástrojů, ale také díky němu mohou uživatelé Windows při práci na Linuxu cítit jako doma.
Spravujte síťová připojení z příkazového řádku Linuxu pomocí nmcli Použijte tento cheat pro tmux jako terminálový multiplexerLinux