Восстановить полную команду, сгенерированную дампом ядра

Программа, над которой я работаю, сбой и генерирование дампов ядра. Я думаю, что проблема связана с аргументами, с которыми она вызывается, некоторые из которых автоматически генерируются другой (довольно сложной) программой. Поэтому я попытался использовать gdb для отладки или file core.MyApplication.1234 чтобы получить аргументы.

Однако команда довольно длинная, и результат выглядит примерно так:

 core.MyApplication.1234: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './MyApplication -view -mwip localhost -mwnp 12345 -mwlp 12346 -mwti 12347 -Debu' 

(Я изменил имена для этого примера, но вы поняли эту идею.)

Я знаю, что после этого было несколько аргументов, но в основных файлах команда всегда усекается с 80 символами. Оба gdb и file сообщают об этом. Глядя на вывод objdump я не уверен, что остальные были даже записаны в дамп ядра, потому что он, похоже, отключается после «-Debu».

Я запускаю это на RHEL6. Я нашел эту pargs с 2007 года, описывая решение для систем Solaris с использованием pargs , но это не действительная команда в моей системе, а эквиваленты Red Hat, которые я нашел, работают только на запущенных процессах, а не на основном файле.

Как я могу восстановить всю команду, используемую для запуска программы? Возможно ли это?

  • Что запускает приглашение для входа в RHEL?
  • Операция NFS COMMIT не используется, несмотря на использование fsync
  • Как определить размер блока файловой системы vxfs?
  • рекомендуемое место хранения для нескольких пользователей
  • usermod всегда сообщает, что пользователь не существует на RHEL 6.6
  • yum install http://www.example.com/package.rpm vpm rpm -ivh http://www.example.com/package.rpm
  • profile.d на безголовом сервере
  • Включение настраиваемого журнала аудита в RedHat
  • One Solution collect form web for “Восстановить полную команду, сгенерированную дампом ядра”

    Данные есть (по крайней мере, до 999 записей на сумму не менее 6885 байт пронумерованных бластов):

     > cat segfault.c int main(int argc, char *argv[]) { char *s = "hello world"; *s = 'H'; } > cc -g -o segfault segfault.c > limit coredumpsize 9999999 > ./segfault `perl -le 'print "blah$_" for 1..999'` Segmentation fault (core dumped) > strings core.12231 | grep -c blah 1000 

    Затем с быстрым altagoobingleducking из gdb , и принимая символы отладки, это можно восстановить через что-то вроде:

     > gdb ./segfault core.12231 ... (gdb) p argc $1 = 1000 (gdb) x/1000s *argv ... 

    Другой вариант – использовать простую оболочку оболочки, которая записывает "$@" где-нибудь, а затем выполняет правильную программу с данными аргументами.

    Linux и Unix - лучшая ОС в мире.