Чому strace / gdb не приєднується до процесу, хоча я root?


26
  • Я ввійшов як root, але straceдає мені це:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 балів / 2 00:00:00 111
     3810 балів / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    attach: ptrace (PTRACE_ATTACH, ...): Операція не дозволена
    Не вдалося долучити до обробки. Якщо ваш ідентичний номер відповідає нулю цілі
    обробити налаштування / proc / sys / kernel / yama / ptrace_scope або спробувати
    знову як користувач root. Докладніше див. /Etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-System: / home / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / ядро ​​/ yama / ptrace_scope
    0
  • Потім я спробував використати gdbдля налагодження багатопроцесорну програму в Eclipse CDT з розгортанням, і це дало мені той же результат / помилку:

    введіть тут опис зображення

Будь-які ідеї?


Оскільки ptrace_scope дорівнює нулю, це не має значення, але так само, як експеримент, можна спробувати більш просте використання strace, де процес відстеження є батьківським процесом, який відстежується. Наприклад strace /bin/echo test? Це дає те саме повідомлення про помилку?
Jordan Uggla

@EliahKagan, теоретично те, що описав ОП не може відбуватися за відсутності помилки ядра. Якщо у вас є деякий час у найближчі 24 години або близько того, і ви можете перетворити ваш коментар на відповідь, це було б чудово - моє тестування на Precision не виявило проблем, і таким чином, це буде остаточною відповіддю, що була якась химерність в конфігурації Ора ... він не повернувся , так як його початковим питання 29 травня
іш

@EliahKagan, Одна річ просто вразила мене, коли перечитав біт "операція не дозволена" - тому що я бачив це ще багато разів, коли я нібито корінь на OpenVZ VPS / VM (вони поділяють ядро ​​хост-машини, так що ні , ти лише король свого маленького острова) ... можливо, це було так? Дивіться цю пасту
іш

@izx Термін дії вашої пасти закінчився. І у мене це питання (всередині контейнера), будь-яке розуміння було б непоганим
Kunal Tyagi

Відповіді:


25

Одна з причин помилки:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

тому , що процес уже приєднано до с gdb, straceабо аналогічний. Щоб перевірити, чи це так, запустіть:

grep TracerPid /proc/$THE_PID/status

Якщо він є ненульовим, це пид існуючої програми, яка вже простежує цей процес.


Ми цього не помічаємо, якщо налагоджуємо в Eclipse ... який уже використовує GDB
ernesto

Дякуємо, що вказали на це. Я запускав програму через обтягувальну стрічку. Програма розкручується, а потім виконує себе. Дитина, що виконує дію, швидко гине, коли вона запускає обгортку, яка не вдається приєднатись, оскільки батьківський процес вже знаходиться під контролем страйку.
Роб Кеннеді

18

Як прокоментував izx , це може статися лише через помилку ядра. Тому всім, хто може наразі створити цю проблему - включаючи та особливо оригінальний плакат цього питання - було б радимо повідомити про це як про помилку , прочитавши цю сторінку ретельно та уважно, а потім запустивши ubuntu-bug linuxна постраждалу машину . Про це слід звітувати протиlinux в Ubuntu, а не проти основного ядра (вище), якщо ви не зможете створити його на основному ядрі (вам доведеться yamaзавантажити).

Очікувана поведінка у кожній версії Ubuntu, починаючи з Ubuntu 10.10, полягає в тому, що процес A не може простежити запущений процес B, якщо B не є прямим дочірнім пристроєм A (або A працює як root ). Це підвищення безпеки, завдяки якому процес, який зловмисник порушує, не може використовувати засоби налагодження, що надаються ядром, для виявлення інформації з інших процесів. Це пояснюється в розділі сфери ptrace на вікі-сторінці спільноти Функції безпеки .

Це обмежувальне поведінка за замовчуванням, але його можна змінити, щоб дозволити процесу A відстежувати будь-який запущений процес B, який запускається з тим самим ідентифікатором користувача, що і власний процес A. Тобто ви можете налаштувати вашу систему, щоб дозволити будь-якому з ваших процесів налагоджувати один одного. Це спрощує приєднання налагоджувачів до вже запущених процесів.

Налаштування для цього відкривається системою /proc/sys/kernel/yama/ptrace_scope sysctl . 1позначає більш обмежувальну поведінку і 0менш обмежувальну поведінку. Налаштування можна прочитати за допомогою:

cat /proc/sys/kernel/yama/ptrace_scope

Менш обмежувальну (не за замовчуванням) поведінку можна встановити за допомогою:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

А більш обмежувальну (за замовчуванням) поведінку можна встановити (або повернути назад) за допомогою:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Мало того, що оригінальний плакат цього питання не зміг приєднати straceекземпляр до поточно запущеного процесу, ptrace-scopeвстановленого на 0, але оригінальний плакат тоді ще не міг цього зробити під час запуску straceяк root. Важко зрозуміти, як це може бути не що інше, як помилка - настійно рекомендую повідомити про це як про одне.

Спочатку я думав, що мені вдається відтворити проблему, коли ptrace_scopeналаштування 0ігнорується і трактується так, ніби воно є1 . Але я більше не вірю, що це так, тому що я знову все робив, і не можу відтворити проблему. Я перевірив це на:

  • Фізична машина Lubuntu Precision amd64, яку я щодня використовую як основну коробку.
  • Віртуальна машина VirtualBox, на якій працює живий компакт-диск Lubuntu Precision i386 (12.04).
  • Ідентична віртуальна машина VirtualBox, що працює щоденно наживо Quantal i386 (Ubuntu + 1) (20120608).

На всіх трьох машинах відбувається очікувана поведінка, і я не можу відтворити умову, про яку задається оригінальний афіша цього питання. Ось текст із Терміналу (із системи Precision Live):

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---

strace продовжував видавати повідомлення, поки я не призупинив її, як очікувалося.

Я закінчую, рекомендуючи ще раз повідомити про це як про помилку. Максимально включений пошук на https://bugs.launchpad.net (який включає будь-які повідомлення про помилки Ubuntu) для тексту ptrace_scopeдає лише декілька результатів, в яких явно жоден не є звіти про цю помилку . Повідомлення про помилку допоможе іншим, може призвести до вирішення проблем чи виправлення, і, ймовірно, єдиний змістовний спосіб продовжувати роботу над цією проблемою (якщо припустити, що проблема все ще виникає).


Дякую за пропозицію, я детально прочитаю її завтра і, можливо, додам підзаголовки, але я вважаю, що це надзвичайно ретельно :)
Останній

в моєму дописі ви можете побачити: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 Я це зробив: ехо 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz

У конколі все працює легко. Але якщо я запустив програму в затемненні і спробував страйк від консолі, я отримав цю проблему.
andreykyz

2
може бути побічним ефектом процесу, який вже простежується? У мене була така ж проблема при використанні gdb у батьківському процесі з дитиною в режимі дозволеної вилки
Джеймі Пате

2
Я також отримую цю помилку 14.04. Хтось знає, чи не повідомлялося про помилку?
detly
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.