Как заставить strace печатать адреса строковых аргументов, а не только их значения?

Я пытаюсь использовать strace, чтобы понять, как двоичная программа использует память.

Однако вывод по умолчанию strace, чтобы быть более удобным для пользователя, печатает любые буферы char * как соответствующие строки.

read(3, "Tell me, Muse, of that man of ma"..., 4096) = 270

Есть ли способ сообщить strace, чтобы он печатал фактический адрес строки рядом с ее содержимым?

Если невозможно иметь и то, и другое, можно также напечатать только адрес строки вместо ее усеченного содержимого.


person m000    schedule 17.02.2014    source источник
comment
Я не думаю, что именно так следует использовать strace(1). Вместо этого вы можете взглянуть на ltrace и gdb.   -  person    schedule 17.02.2014
comment
Возможно, это не поддерживается, но я не понимаю, как то, что я описываю, выходит за рамки strace. Он уже делает свою работу, но не печатает информацию в нужном мне формате. Я уже проверил ltrace, и он имеет такое же поведение (т. е. буферы char * печатаются как строки). gdb предназначен для интерактивной отладки, чего я не хочу.   -  person m000    schedule 17.02.2014


Ответы (2)


Вы можете загрузить исходный код strace, изменить все эти tprintf("%s", ...) на tprintf("%p", ...) и создать локальную копию strace. .

person Lee Duhem    schedule 17.02.2014
comment
Исходная модификация является опцией. Я изучаю это, но это немного сложнее, чем кажется. - person m000; 17.02.2014
comment
С нетерпением ждем вашей доли решения этой проблемы. - person Lee Duhem; 17.02.2014
comment
Я сделал этот патч для этой цели: gist.github.com/m000/9240954 Это должно быть довольно легко добавить переключатель командной строки, чтобы включить или выключить это поведение. Но это не стоило бы хлопот, если бы сопровождающие strace не были заинтересованы в том, чтобы объединить это с транком. - person m000; 27.02.2014
comment
@ m000 Отлично, твой патч выглядит очень красиво. - person Lee Duhem; 27.02.2014

-e raw=read уже должен делать то, что вы хотите. Не должно быть необходимости в модификации исходного кода.

Broadway@creepspread:~% strace -e raw=read ls 2>&1|grep ^read
read(0x3, 0x7fff5ea52e78, 0x340) = 0x340
read(0x3, 0x7fff5ea52e48, 0x340) = 0x340
read(0x3, 0x7fff5ea52e48, 0x340) = 0x340
read (0x3, 0x7fff5ea52e18, 0x340) = 0x340
чтение(0x3, 0x7fff5ea52de8, 0x340) = 0x340
чтение(0x3, 0x7fff5ea52ca8, 0x340) = 0x340
чтение(0x3, 0x7fff5ea52c40, 0x7x48, 0x03c48, 0x340) > читать(0x3, 0x7fff5ea52c18, 0x340) = 0x340
читать(0x3, 0x7fef1433f000, 0x400) = 0x136
читать(0x3, 0x7fef1433f000, 0x400) = 0

person Brian Mitchell    schedule 28.02.2014
comment
Приятно это знать. Все-таки при отладке полезно знать и что и где. По умолчанию strace показывает только то, что написано. С этой опцией он показывает только то, где это написано. С изменениями, внесенными моим патчем, он показывает вам оба: read(3, 0x9118000:Это strace, системный вызов tr..., 32768) = 592 - person m000; 28.02.2014
comment
-e raw=read -e read=all показывает как некодированные данные для системного вызова read, так и шестнадцатеричный дамп прочитанного. Аргумент -e read представляет собой список файловых дескрипторов, поэтому вы можете отфильтровать его таким образом. - person Brian Mitchell; 01.03.2014