GNU/Linux >> Znalost Linux >  >> Linux

Ladění Linuxu pomocí ProcDump

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     <        <          <      d   Dá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ář je bin/ , kde je zkompilovaný procdump program je uložen. Kompiluje také další testovací binární soubor s názvem ProcDumpTestApplication :

$ 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 do bin/ složka. Chcete-li jej zpřístupnit odkudkoli v systému, spusťte make install . Toto zkopíruje binární soubor do obvyklého bin/ 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 nebo ps . 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. Zde bt (backtrace) ukazuje, že sleep() 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ťte gcore 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žijte gdb 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 zkontrolujte ulimit je nastaven pro základní soubory; pokud je nastaveno na 0 , 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í soubor progxyz :

$ 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.


Linux
  1. Odstraňte problémy s použitím souborového systému proc na Linuxu

  2. Jak ladit programy C v Linuxu pomocí gdb

  3. Použití příkazu ripgrep (rg) v Linuxu

  1. 50 Výukové programy Sysadmin pro UNIX / Linux

  2. Kali Linux na Androidu pomocí Linux Deploy

  3. Příklad použití getnstimeofday v jádře Linuxu

  1. Přesuňte složku v Linuxu pomocí příkazu mv

  2. IPC využívající signály na linuxu

  3. Linuxový systém řazení front