Получите указатель команд запущенного приложения на Unix

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

можно также понравиться Корица . Это - рабочий стол по умолчанию для Linux Mint. Существует ppa для Ubuntu, которая имеет пакеты для 12,04. Это имеет стиль Классического Gnome, но с некоторыми хорошими новыми возможностями как доступные для поиска меню.

я соглашаюсь с Набором Sun, тем не менее, Единица действительно хороша, после того как Вы привыкаете к нему. После того как Вы ловите видение, Вы не оглянетесь назад.

5
задан LK__ 31 August 2009 в 14:14
поделиться

4 ответа

В Linux есть / proc / [pid] / stat . Из "man proc" :

 stat   Status information about the process. This is used by
       ps(1). It is defined in /usr/src/linux/fs/proc/array.c.
       ...
       kstkeip %lu
       The current EIP (instruction pointer).

AFAICT, 29-е поле вывода соответствует текущему указателю инструкции процесса. Например:

gdb date
GNU gdb Red Hat Linux (6.0post-0.20040223.20rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...(no debugging symbols found)...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

(gdb) set stop-on-solib-events 1
(gdb) run
(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...[Thread debugging using libthread_db enabled]
[New Thread 182896391360 (LWP 27968)]
(no debugging symbols found)...Stopped due to shared library event
(gdb) c
[Switching to Thread 182896391360 (LWP 27968)]
Stopped due to shared library event
(gdb) where
#0  0x00000036b060bb20 in _dl_debug_state_internal () from /lib64/ld-linux-x86-64.so.2
#1  0x00000036b060b51c in _dl_init_internal () from /lib64/ld-linux-x86-64.so.2
#2  0x00000036b0600f72 in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#3  0x0000000000000001 in ?? ()
#4  0x0000007fbff62728 in ?? ()
#5  0x0000000000000000 in ?? ()
(gdb) shell cat /proc/27968/stat
27968 (date) T 27839 27968 8955 34817 27839 4194304 42 0 330 0 0 0 0 0 18 0 0 0 1881668573 6144000 78 18446744073709551615 4194304 4234416 548680739552 18446744073709551615 234887363360 0 0 0 0 18446744071563322838 0 0 17 0 0 0 0 0 0 0
(gdb) p/a 234887363360  <--- the value of 29th field
$1 = 0x36b060bb20 <_dl_debug_state_internal>
6
ответ дан 14 December 2019 в 01:12
поделиться

Указатель инструкции можно получить в Linux с помощью следующего кода:

pid_t traced_process;
struct user_regs_struct regs;

ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
ptrace(PTRACE_GETREGS, traced_process, NULL, &regs);

printf("EIP: %lx\n", regs.eip);
2
ответ дан 14 December 2019 в 01:12
поделиться

Если вы все равно используете gdb, вы можете просто присоединиться к запущенному процессу следующим образом:

gdb program 1234

где программа - это имя исполняемого файла, который вы отладка, а 1234 - это PID. Затем вы можете использовать все возможности gdb для отладки процесса.

0
ответ дан 14 December 2019 в 01:12
поделиться

Вам нужно будет временно остановить процесс или поток, чтобы получить его текущий указатель инструкции. Вы можете сделать это, подключившись к процессу с помощью ptrace () или (в HP-UX) ttrace () и получив доступ к регистрам.

1
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: