Linux attach console to process

Attach to process

CLion provides a way to attach the debugger to both local and remote processes.

For C/C++ applications, you can attach to a process with GDB on Windows, LLDB on macOS, and both GDB and LLDB on Linux. When applicable, debuggers for other languages (for example, Python debugger or Swift LLDB) can be used as well.

First off, if you want to debug a program that can be started from CLion, the best way to do it is to start a local debugging session.

Prerequisites for Ubuntu users

If you are using CLion on Ubuntu (or probably, on some other Linux distribution), an error message ptrace: Operation not permitted may appear upon your first attempt to attach to a process. In this case, do one of the following:

To disable this restriction temporarily, enter the command:

To disable this restriction permanently, open the /etc/sysctl.d/10-ptrace.conf file for editing and change the line kernel.yama.ptrace_scope = 1 to kernel.yama.ptrace_scope = 0 .

To apply the changes immediately, enter the above command echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope .

Alternatively, run sudo service procps restart or restart your system.

You can find more details here.

Attach to a local process

Press Ctrl+Alt+F5 or choose Run | Attach to Process from the main menu.

The list of running local processes is shown. Select the process to attach to.

If necessary, narrow down the list of processes by typing the first letters of its name or PID. If there are several debuggers that can be used for the selected process, you can choose among them in the popup menu:

By default, you will not be able to attach the debugger to a process launched with sudo privileges. As a workaround, try running CLion under the same privileged user.

Proceed with debugging the same way as you usually do it in CLion (set breakpoints, step through, pause and resume the process, evaluate expressions, and so on):

Note that in case the process you have attached to does not provide debug information, breakpoints will be unavailable and stepping will be performed in the disassembly view.

Detach from a process

The procedure to detach from a remote process is the same as for stopping a local debug session, however, the effect is different. When you detach, the debugging session closes but the process continues to run.

Click the Stop button on the main toolbar on in the Debug tool window.

Alternatively, click Stop on the main toolbar or press Ctrl+F2 , then select the session to be closed.

Источник

Linux C++ Workload improvements to the Project System, Linux Console Window, rsync and Attach to Process

March 13th, 2018

In Visual Studio 2017 15.7 Preview 1 we have made a number of improvements to our support to the Linux C++ workload based on your feedback. You can learn more about our Linux C++ workload in Visual Studio here .

MSBuild Project System improvements

We added some new properties to Linux projects on the C/C++ General properties page. Max Parallel Compilation Jobs allows you to launch additional compilation processes. The default is 1 but can be increased to improve your build throughput. Public Project Include Directories allows you to specify directories in your project you want exposed to other projects in your solution. In the consuming project, add a reference to the project that exposed its include directories and now you can reference them from your source.

Linux Console Window improvements

Now on launch or debug of a Linux project the Linux console window will be displayed. If you dock this window the position will be remembered on subsequent launches. When you return from debug mode the window will be closed. We also fixed our handling of echo on/off to properly display messages from the remote system.

Читайте также:  Темная тема windows 10 папки

Rsync improvements for CMake and open folder

Our rsync support in open folder and CMake scenarios has also seen some improvements. Previously rsync would run to completion even if you had cancelled the task that started it, this has been fixed. If rsync is triggered by a build for example and you cancel the build rsync will now cancel execution. We’ve also made some performance improvements and enabled rsync with root users. You can also now pass additional command arguments to rsync using the rsyncCommandArgs option in CMakeSettings.json.

Attach to Process improvements

You have given us feedback regarding the need to have more control over the Attach to Process scenario for remote Linux debugging. We’ve added a lot of the controls that are possible through normal debug launch settings for Linux projects or Open Folder, such as enabling child process debugging, pre attach commands, etc. To enable this place a file named Microsoft.MIEngine.Options.xml in the root of your solution or workspace. Here is a simple example

The AttachOptionsForConnection has most of the attributes you may need. The example above shows passing a location to search for additional .so libraries. The child element ServerOptions enables attaching to the remote process with gdbserver instead. To do that you need to specify a local gdb client (the one shipped in VS is shown above) and a local copy of the binary with symbols. The other child element SetupCommands allows you to pass commands directly to gdb. You can find all the options available in the LaunchOptions.xsd schema , look at the root element for this file of SupplementalLaunchOptions.

What’s next

Download the Visual Studio 2017 Preview , install the Linux C++ Workload and give it a try with your projects.

Источник

Управление процессами в Linux

Материал этой статьи ни в коем случае не претендует на свою избыточность. Более подробно о процессах вы можете прочитать в книгах, посвященных программированию под UNIX.

Процессы. Системные вызовы fork() и exec(). Нити.

Процесс в Linux (как и в UNIX) — это программа, которая выполняется в отдельном виртуальном адресном пространстве. Когда пользователь регистрируется в системе, автоматически создается процесс, в котором выполняется оболочка (shell), например, /bin/bash.

В Linux поддерживается классическая схема мультипрограммирования. Linux поддерживает параллельное (или квазипараллельного при наличии только одного процессора) выполнение процессов пользователя. Каждый процесс выполняется в собственном виртуальном адресном пространстве, т.е. процессы защищены друг от друга и крах одного процесса никак не повлияет на другие выполняющиеся процессы и на всю систему в целом. Один процесс не может прочитать что-либо из памяти (или записать в нее) другого процесса без «разрешения» на то другого процесса. Санкционированные взаимодействия между процессами допускаются системой.

Ядро предоставляет системные вызовы для создания новых процессов и для управления порожденными процессами. Любая программа может начать выполняться только если другой процесс ее запустит или произойдет какое-то прерывание (например, прерывание внешнего устройства).

В связи с развитием SMP (Symmetric Multiprocessor Architectures) в ядро Linux был внедрен механизм нитей или потоков управления (threads). Нить — это процесс, который выполняется в виртуальной памяти, используемой вместе с другими нитями процесса, который обладает отдельной виртуальной памятью.

Если интерпретатору (shell) встречается команда, соответствующая выполняемому файлу, интерпретатор выполняет ее, начиная с точки входа (entry point). Для С-программ entry point — это функция main. Запущенная программа тоже может создать процесс, т.е. запустить какую-то программу и ее выполнение тоже начнется с функции main.

Для создания процессов используются два системных вызова: fork() и exec. fork() создает новое адресное пространство, которое полностью идентично адресному пространству основного процесса. После выполнения этого системного вызова мы получаем два абсолютно одинаковых процесса — основной и порожденный. Функция fork() возвращает 0 в порожденном процессе и PID (Process ID — идентификатор порожденного процесса) — в основном. PID — это целое число.
Теперь, когда мы уже создали процесс, мы можем запустить программу с помощью вызова exec. Параметрами функции exec является имя выполняемого файла и, если нужно, параметры, которые будут переданы этой программе. В адресное пространство порожденного с помощью fork() процесса будет загружена новая программа и ее выполнение начнется с точки входа (адрес функции main).

Читайте также:  Windows не может распознать iphone

В качестве примера рассмотрим этот фрагмент программы

if (fork()==0) wait(0);
else execl(«ls», «ls», 0); /* порожденный процесс */

Теперь рассмотрим более подробно, что же делается при выполнении вызова fork():

  1. Выделяется память для описателя нового процесса в таблице процессов
  2. Назначается идентификатор процесса PID
  3. Создается логическая копия процесса, который выполняет fork() — полное копирование содержимого виртуальной памяти родительского процесса, копирование составляющих ядерного статического и динамического контекстов процесса-предка
  4. Увеличиваются счетчики открытия файлов (порожденный процесс наследует все открытые файлы родительского процесса).
  5. Возвращается PID в точку возврата из системного вызова в родительском процессе и 0 — в процессе-потомке.

Общая схема управления процессами
Каждый процесс может порождать полностью идентичный процесс с помощью fork(). Родительский процесс может дожидаться окончания выполнения всех своих процессов-потомков с помощью системного вызова wait.
В любой момент времени процесс может изменить содержимое своего образа памяти, используя одну из разновидностей вызова exec. Каждый процесс реагирует на сигналы и, естественно, может установить собственную реакцию на сигналы, производимые операционной системой. Приоритет процесса может быть изменен с помощью системного вызова nice.

Сигнал — способ информирования процесса ядром о происшествии какого-то события. Если возникает несколько однотипных событий, процессу будет подан только один сигнал. Сигнал означает, что произошло событие, но ядро не сообщает сколько таких событий произошло.

Примеры сигналов:

  1. окончание порожденного процесса (например, из-за системного вызова exit (см. ниже))
  2. возникновение исключительной ситуации
  3. сигналы, поступающие от пользователя при нажатии определенных клавиш.

Установить реакцию на поступление сигнала можно с помощью системного вызова signal
func = signal(snum, function);

snum — номер сигнала, а function — адрес функции, которая должна быть выполнена при поступлении указанного сигнала. Возвращаемое значение — адрес функции, которая будет реагировать на поступление сигнала. Вместо function можно указать ноль или единицу. Если был указан ноль, то при поступлении сигнала snum выполнение процесса будет прервано аналогично вызову exit. Если указать единицу, данный сигнал будет проигнорирован, но это возможно не для всех процессов.

С помощью системного вызова kill можно сгенерировать сигналы и передать их другим процессам.
kill(pid, snum);
где pid — идентификатор процесса, а snum — номер сигнала, который будет передан процессу. Обычно kill используется для того, чтобы принудительно завершить («убить») процесс.
Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всем процессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка, идентификатор группы процесса можно изменить с помощью системного вызова setpgrp. Если вместо pid указать -1, ядро передаст сигнал всем процессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, который посылает сигнал.

Таблица 1. Номера сигналов

Номер Название Описание
01 SIGHUP Освобождение линии (hangup).
02 SIGINT Прерывание (interrupt).
03 SIGQUIT Выход (quit).
04 SIGILL Некорректная команда (illegal instruction). Не переустанавливается при перехвате.
05 SIGTRAP Трассировочное прерывание (trace trap). Не переустанавливается при перехвате.
06 SIGIOT или SIGABRT Машинная команда IOT.
07 SIGEMT Машинная команда EMT.
08 SIGFPE Исключительная ситуация при выполнении операции с вещественными числами (floating-point exception)
09 SIGKILL Уничтожение процесса (kill). Не перехватывается и не игнорируется.
10 SIGBUS Ошибка шины (bus error).
11 SIGSEGV Некорректное обращение к сегменту памяти (segmentation violation).
12 SIGSYS Некорректный параметр системного вызова (bad argument to system call).
13 SIGPIPE Запись в канал, из которого некому читать (write on a pipe with no one to read it).
14 SIGALRM Будильник
15 SIGTERM Программный сигнал завершения
16 SIGUSR1 Определяемый пользователем сигнал 1
17 SIGUSR2 Определяемый пользователем сигнал 2
18 SIGCLD Завершение порожденного процесса (death of a child).
19 SIGPWR Ошибка питания
22 Регистрация выборочного события

Сигналы (точнее их номера) описаны в файле singnal.h

Читайте также:  Как сменить файловую систему linux

Для нормального завершение процесса используется вызов
exit(status);
где status — это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.
Вызов exit может задаваться в любой точке программы, но может быть и неявным, например при выходе из функции main (при программировании на C) оператор return 0 будет воспринят как системный вызов exit(0);

Перенаправление ввода/вывода

Практически все операционные системы обладают механизмом перенаправления ввода/вывода. Linux не является исключением из этого правила. Обычно программы вводят текстовые данные с консоли (терминала) и выводят данные на консоль. При вводе под консолью подразумевается клавиатура, а при выводе — дисплей терминала. Клавиатура и дисплей — это, соответственно, стандартный ввод и вывод (stdin и stdout). Любой ввод/вывод можно интерпретировать как ввод из некоторого файла и вывод в файл. Работа с файлами производится через их дескрипторы. Для организации ввода/вывода в UNIX используются три файла: stdin (дескриптор 1), stdout (2) и stderr(3).

Символ > используется для перенаправления стандартного вывода в файл.
Пример:
$ cat > newfile.txt Стандартный ввод команды cat будет перенаправлен в файл newfile.txt, который будет создан после выполнения этой команды. Если файл с этим именем уже существует, то он будет перезаписан. Нажатие Ctrl + D остановит перенаправление и прерывает выполнение команды cat.

Символ &lt используется для переназначения стандартного ввода команды. Например, при выполнении команды cat > используется для присоединения данных в конец файла (append) стандартного вывода команды. Например, в отличие от случая с символом >, выполнение команды cat >> newfile.txt не перезапишет файл в случае его существования, а добавит данные в его конец.

Символ | используется для перенаправления стандартного вывода одной программы на стандартный ввод другой. Напрмер, ps -ax | grep httpd.

Команды для управления процессами

Предназначена для вывода информации о выполняемых процессах. Данная команда имеет много параметров, о которых вы можете прочитать в руководстве (man ps). Здесь я опишу лишь наиболее часто используемые мной:

Параметр Описание
-a отобразить все процессы, связанных с терминалом (отображаются процессы всех пользователей)
-e отобразить все процессы
-t список терминалов отобразить процессы, связанные с терминалами
-u идентификаторы пользователей отобразить процессы, связанные с данными идентификаторыми
-g идентификаторы групп отобразить процессы, связанные с данными идентификаторыми групп
-x отобразить все процессы, не связанные с терминалом

Например, после ввода команды ps -a вы увидите примерно следующее:

Для вывода информации о конкретном процессе мы можем воспользоваться командой:

В приведенном выше примере используется перенаправление ввода вывода между программами ps и grep, и как результат получаем информацию обо всех процессах содержащих в строке запуска «httpd». Данную команду (ps -ax | grep httpd) я написал только лишь в демонстрационных целях — гораздо проще использовать параметр -С программы ps вместо перенаправления ввода вывода и параметр -e вместо -ax.

Предназначена для вывода информации о процессах в реальном времени. Процессы сортируются по максимальному занимаемому процессорному времени, но вы можете изменить порядок сортировки (см. man top). Программа также сообщает о свободных системных ресурсах.

Просмотреть информацию об оперативной памяти вы можете с помощью команды free, а о дисковой — df. Информация о зарегистрированных в системе пользователей доступна по команде w.

Изменение приоритета процесса — команда nice

nice [-коэффициент понижения] команда [аргумент]

Команда nice выполняет указанную команду с пониженным приоритетом, коэффициент понижения указывается в диапазоне 1..19 (по умолчанию он равен 10). Суперпользователь может повышать приоритет команды, для этого нужно указать отрицательный коэффициент, например —10. Если указать коэффициент больше 19, то он будет рассматриваться как 19.

nohup — игнорирование сигналов прерывания

nohup команда [аргумент]

nohup выполняет запуск команды в режиме игнорирования сигналов. Не игнорируются только сигналы SIGHUP и SIGQUIT.

kill — принудительное завершение процесса

kill [-номер сигнала] PID

где PID — идентификатор процесса, который можно узнать с помощью команды ps.

Команды выполнения процессов в фоновом режиме — jobs, fg, bg

Команда jobs выводит список процессов, которые выполняются в фоновом режиме, fg — переводит процесс в нормальные режим («на передний план» — foreground), а bg — в фоновый. Запустить программу в фоновом режиме можно с помощью конструкции &

Источник

Оцените статью