Для Unix domain socket до сих пор отсутствовал инструмент для захвата или ослеживания содержимого канала связи, наподобие tcpdump для IP. Для решения данной задачи [[http://laforge.gnumonks.org/blog/20180330-udtrace/ подготовлен]] новый инструмент [[https://github.com/laf0rge/udtrace udtrace]], который реализован в виде разделяемой библиотеки, подключаемой через LD_PRELOAD.
Загружаем код из Git:git clone git://git.gnumonks.org/udtrace
Собираем командой:
make
Запускаем интересующее приложение в режиме трасиировки:
LD_PRELOAD=libudtrace.os программа
Например, чтобы узнать какие данные передаёт systemctl через Unix-сокет при выполнении команды "stat", можно запустить:
LD_PRELOAD=libudtrace.so systemctl status
>>> UDTRACE: Unix Domain Socket Trace initialized (TITAN support DISABLED)
>>> UDTRACE: Adding FD 4
>>> UDTRACE: connect(4, "/run/dbus/system_bus_socket")
4 sendmsg W 00415554482045585445524e414c20
4 sendmsg W 3331333033303330
4 sendmsg W 0d0a4e45474f54494154455f554e49585f46440d0a424547494e0d0a
[...]
UDTRACE: Removing FD 4где,
* 4 - номер файлового дескриптора
* sendmsg - имя системного вызова (кроме sendmsg может быть read, write , readv и т.п.)
* R|W - операция чтения или записи (со стороны отслеживаемого процесса)
* шестнадцатеричный дамп переданных или полученных данных (отображаются только реально переданные через сокет данные, а не попавшие буфер передачи)Для декодирования шестнадцатеричного дампа можно собрать декодировщики от проекта Osmocom, написанные на языке TTCN-3 с использованием [[https://projects.eclipse.org/projects/tools.titan Eclipse TITAN]]. Для их включения при сборке можно указать флаг
make ENABLE_TITAN=1
После чего запускать трассировку строкой вида:
LD_LIBRARY_PATH=/usr/lib/titan LD_PRELOAD=libudtrace.so systemctl status
URL: http://laforge.gnumonks.org/blog/20180330-udtrace/
Обсуждается: http://www.opennet.dev/tips/info/3057.shtml
А чего не показали, как изменится выхлоп, после применения шестнадцатеричного декодировщика?
Тоже интересно было бы посмотреть...
Где тот герой, кто оторвет жопу от дивана, и пересоберет udtrace, и воспроизведет пример из статьи?
Что из этого нельзя в strace? Или strace слишком архаично для *Ops-ов?
Тем, что strace работает через ptrace? Разве не очевидно?
В *strace очевидно много лишнего.Интересней зачем кому-то использовать unix sockets - для общесистемных нужд?
Для каких прикладных задач может быть полезно. nginx не предлагать, Сысоев не одобрит.
Для каких прикладных задач - это вопрос. Вопросительный знак потерялся. :)
>Для каких прикладных задач может быть полезно. nginx не предлагать, Сысоев не одобрит.А что, чтобы применить для чего-либо этот nginx, нужно спрашивать одобрения у Сысоева? Такой "свободный" проект...
Одобрение спрашивать не нужно, но полезно знать ограничения продукта, который ты используешь.Так вот Сысоев как-то высказался в духе, что использовать unix sockets в nginx не стоит.
> В *strace очевидно много лишнего.
> Интересней зачем кому-то использовать unix sockets - для общесистемных нужд?Пошарь на своём локалхостике в выводе -
for mp in /{,var/,run/}; doи подумай, зачем _тебе_ это?
mountpoint -q $mp && find $mp -mount -type s;
done 2>/dev/null> Для каких прикладных задач может быть полезно. nginx не предлагать, Сысоев не
> одобрит.
Годный ответ. Спасибо.
> Годный ответ. Спасибо.Пожалуйста.
Там ещё ',tmp/' перед '}' имеет смысл добавить.
...и, для ценителей:
$ lsof -U |sort -k9 |less -S
# lsof -U |sort -k6,6 -k9 |awk '{if($6!=x){l=$0;x=$6}else{if(l)print l;print;l=""}}' |less -S
Можно как-то так:$ sudo socat -v UNIX-LISTEN:/tmp/socat-listen,ignoreeof,fork UNIX-CONNECT:/var/run/docker.sock,ignoreeof &
[1] 14726
$ sudo docker --host=unix:///tmp/socat-listen images
> 2018/04/12 12:46:29.989304 length=79 from=0 to=78GET /_ping HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/1.13.1 (linux)\r
\r
< 2018/04/12 12:46:29.994767 length=196 from=0 to=195
HTTP/1.1 200 OK\r
Api-Version: 1.26\r
Docker-Experimental: false\r
Server: Docker/1.13.1 (linux)\r
Date: Thu, 12 Apr 2018 19:46:29 GMT\r
Content-Length: 2\r
Content-Type: text/plain; charset=utf-8\r
\r
OK> 2018/04/12 12:46:29.999271 length=91 from=79 to=169
GET /v1.26/images/json HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/1.13.1 (linux)\r
\r
< 2018/04/12 12:46:30.000197 length=516 from=196 to=711
HTTP/1.1 200 OK\r
Api-Version: 1.26\r
Content-Type: application/json\r
Docker-Experimental: false\r
Server: Docker/1.13.1 (linux)\r
Date: Thu, 12 Apr 2018 19:46:30 GMT\r
Content-Length: 329\r
\r
[{"Containers":-1,"Created":1522924888,"Id":"sha256:8ac48589692a53a9b8c2d1ceaa6b402665aa7fe667ba51ccc03002300856d8c7","Labels":null,"ParentId":"","RepoDigests":["busybox@sha256:58ac43b2cc92c687a32c8be6278e50a063579655fe3090125dcb2af0ff9e1a64"],"RepoTags":["busybox:latest"],"SharedSize":-1,"Size":1146369,"VirtualSize":1146369}]
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 8ac48589692a 7 days ago 1.15 MB
$Вместо -v можно -x (hexadecimal), или комбирированный -v -x. Ну и банальный strace -e.... никто не отменял.
Можно так:
https://superuser.com/a/576404
если можно.
Способ с LD_PRELOAD вообще позволяет прикалываться над программами по всякому. Можно завернуть неугодные вызовы, можно туфту возвращать. Ну и просто изучать что программа делает. И логгить, если хочется.Я так делал для open - можно логить что программа пыталась открыть. А можно и завернуть нафиг. Все. Или не все. Дешево и сердито.
>Ну и просто изучать что программа делает.Маленький Столман плачет в каждом читающем это.
На FreeBSD не собирается:
root@tank1:/tmp/udtrace/udtrace# gmake
cc -Wall -fPIC -o utils.o -c utils.c
cc -Wall -fPIC -o sock_events.o -c sock_events.c
In file included from sock_events.c:3:
./sock_events.h:8:10: fatal error: 'sys/epoll.h' file not found
#include <sys/epoll.h>
^~~~~~~~~~~~~
1 error generated.
gmake: *** [Makefile:18: sock_events.o] Ошибка 1
Патамушта там kqueue
sysdig не ?
Нажрались системдятины? Теперь трассировщик нужен?
Не хотели кушать bash, жрите блобы и дампы.