Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
1

Получить список загруженных библиотек конкретного процесса

21.04.2015, 16:09. Просмотров 2643. Ответов 17
Метки нет (Все метки)

Можно ли получить список загруженных библиотек(*.so) определенным процессом например по его pid.
Интересуют полные пути к динамически загруженным библиотекам.

Сразу скажу рассматриваю возможность реализации аналога для Блог: Программа для сборки DLL-лок для переноса Qt-приложений для Linux.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2015, 16:09
Ответы с готовыми решениями:

Извлечь список библиотек *.h; * из перечня возможно-выбираемых библиотек VS-2017
Как извлечь список библиотек *.h; * из перечня возможно-выбираемых библиотек VS-2017? см.скрин ->...

Получить список используемых в проекте библиотек
Здравствуйте, в общем есть такая задача: нужно написать приложение, которое будет анализировать...

Как получить у базы список библиотек?
Щас о5 глупость спрошу А есть ли какой-нибудь программный способ получить список подключенных lss...

Получить список модулей процесса
Есть процесс, его я нахожу по ID(проверил выводом имени, исправно) Как мне найти модули процесса и...

Программно получить список методов, свойств, эвентов, констант со всех библиотек в VB6
Доброе время суток всем ! Подскажите пож. Как получить программно список методов, свойств,...

17
schdub
Эксперт С++
3047 / 1389 / 421
Регистрация: 19.01.2009
Сообщений: 3,735
Завершенные тесты: 1
21.04.2015, 16:19 2
Avazart, а не проще ли использовать ldd?

Код
jsbot@dv:~/src/work/adbgui$ ldd adbgui
	linux-vdso.so.1 =>  (0x00007fffa39ab000)
	libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007fe854331000)
	libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007fe853d54000)
	libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007fe85372f000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe85342b000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe853215000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe852e56000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe852c39000)
	libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007fe8529ea000)
	libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fe8526f4000)
	libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fe8523bf000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe8520c3000)
	libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007fe851e9a000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fe851c83000)
	libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007fe851a1d000)
	libicui18n.so.48 => /usr/lib/libicui18n.so.48 (0x00007fe851655000)
	libicuuc.so.48 => /usr/lib/libicuuc.so.48 (0x00007fe8512eb000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe8510e7000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe850ede000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe854b7a000)
	libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fe850cd6000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fe850a98000)
	libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fe85087a000)
	libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007fe850655000)
	libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fe850443000)
	libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007fe850240000)
	libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007fe85003a000)
	libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007fe84fe37000)
	libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007fe84fc20000)
	libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007fe84fa1b000)
	libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fe84f80f000)
	libicudata.so.48 => /usr/lib/libicudata.so.48 (0x00007fe84e49f000)
	libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fe84e29b000)
	libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fe84e095000)
Добавлено через 5 минут
Ну а если нужно обязательно для запущенного процесса по pid то можно глянуть в сторону pmap
0
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
21.04.2015, 16:33  [ТС] 3
Цитата Сообщение от schdub Посмотреть сообщение
Avazart, а не проще ли использовать ldd?
Она не отображает рантайм, к примеру плагины Qt.

Цитата Сообщение от schdub Посмотреть сообщение
Ну а если нужно обязательно для запущенного процесса по pid то можно глянуть в сторону pmap
А можно по подробнее?

Пока нашел только:
http://stackoverflow.com/questions/5...ed-at-run-time
http://syprog.blogspot.ru/2011/12/li...-in-linux.html
Разбираюсь... Это оно?
0
schdub
Эксперт С++
3047 / 1389 / 421
Регистрация: 19.01.2009
Сообщений: 3,735
Завершенные тесты: 1
21.04.2015, 16:53 4
Цитата Сообщение от Avazart Посмотреть сообщение
А можно по подробнее?
Как-то так:
Bash
1
2
3
4
5
6
7
jsbot@dv:~/src/work/adbgui$ ./adbgui &
[1] 11687
jsbot@dv:~/src/work/adbgui$ pmap 11687 | awk '{print $4}' | awk '/.so/' | sort -u
/lib/x86_64-linux-gnu/ld-2.15.so
/lib/x86_64-linux-gnu/libc-2.15.so
/lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
...
не обязательно с собой тащить awk и sort, просто идея в том, что парсится stdout pmap для опреленного pid.

Так же мне понравился strace подход из приведенной вами ссылки.
0
21.04.2015, 16:53
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
21.04.2015, 16:59  [ТС] 5
Ну как бы из плюсов парсить awk другую праграмму на сях...
Т.е я ожидал код именно С++.

В полном виде задача такова, пользователь вводит полный путь к исполняемому файлу, программа должна выдать список разделяемых библиотек (в виде полных путей к ним) который загрузил процесс (соответствующий исполняемому файлу).
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.04.2015, 17:12 6
пропарсите /proc/[pid]/maps . формат там простой.
0
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
21.04.2015, 17:36  [ТС] 7
Цитата Сообщение от retmas Посмотреть сообщение
пропарсите /proc/[pid]/maps . формат там простой.
А не чего что решение г ?

Добавлено через 43 секунды
Еще раз:
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е я ожидал код именно С++.
Собственно раздел плюсовый.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.04.2015, 17:43 8
и чем оно г, если не хотите парсить вывод различных утилит? вы же хотели как я понял без помощи pmap и пр., которые вобщем то и парсят maps, smaps

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е я ожидал код именно С++.
я не понял. на плюсах нельзя парсить файл?
0
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
21.04.2015, 18:04  [ТС] 9
Вероятно по тому что должны быть системые апи ф-ции для решения такой задачи?
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.04.2015, 18:35 10
псевдо-фс /proc и формируется как интерфейс к структурам данных ядра. для таких вещей она и есть. впрочем, вы можете подождать апи...
2
DrOffset
10346 / 5498 / 1359
Регистрация: 30.01.2014
Сообщений: 8,890
22.04.2015, 13:09 11
Цитата Сообщение от Avazart Посмотреть сообщение
А не чего что решение г ?
Нормальное решение. /proc/* - это и есть API.
API в том виде, в каком оно привычно для Windows, нет.
1
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
06.05.2015, 11:49  [ТС] 12
Хз чет до меня сразу не дошло что это отображаемый файл в памяти.
0
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
26.05.2015, 12:36  [ТС] 13
Есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <sys/types.h>
#include <dirent.h>
 
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
 
class DirGuard
{
  public:
    DirGuard(DIR *dir):dir_(dir){}
    ~DirGuard(){ closedir(dir_); }
 
    DIR* dir(){ return dir_; }
  private:
    DIR *dir_;
};
 
typedef char tchar;
typedef std::basic_string<tchar> tstring;
typedef std::basic_ifstream<tchar> tifstream;
 
unsigned long findProcessByName(const tstring& procName)
{
    DirGuard dg(opendir("/proc"));
    if(!dg.dir()) return 0;
 
    struct dirent *dirp= readdir(dg.dir());
    while(dirp)
    {
        unsigned long pid= atoi(dirp->d_name);
        if(pid)
        {
            std::stringstream cmdPath;
            cmdPath<<"/proc/"<<dirp->d_name<<"/cmdline";
 
            tifstream cmdFile(cmdPath.str().c_str());
            if(cmdFile)
            {
              tstring fileName;
              getline(cmdFile, fileName,(tchar)0); // \0
              if (!fileName.empty() && procName == fileName)
                return pid;
            }
        }
        dirp= readdir(dg.dir());
    }
    return 0;
}
При typedef char tchar нормально работает, а при замене на typedef wchar_t tchar; сравнение возвращает false и что-то не соображу как это поправить.
Во вторых нормально ли для Linux возвращать 0 в случае неудачи?
В третьих не нужно ли как-то "освобождать" dirp ?
0
DrOffset
10346 / 5498 / 1359
Регистрация: 30.01.2014
Сообщений: 8,890
26.05.2015, 13:22 14
Цитата Сообщение от Avazart Посмотреть сообщение
и что-то не соображу как это поправить.
Имхо, wchar_t не нужен. Это же винда, в char у тебя и так юникод - UTF-8.
Цитата Сообщение от Avazart Посмотреть сообщение
Во вторых нормально ли для Linux возвращать 0 в случае неудачи?
0 - это корректное значение для pid. Я бы возвращал -1, т.к. это больше в стиле системного API в Linux.

Добавлено через 1 минуту
Не заметил, что у тебя там RAII для дескриптора opendir. dirent * dirp освобождать не надо.
0
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
26.05.2015, 13:35  [ТС] 15
Цитата Сообщение от DrOffset Посмотреть сообщение
Имхо, wchar_t не нужен. Это же винда, в char у тебя и так юникод - UTF-8.
Ну вообщето хотель бы что бы сигнатура выглядела так же как и для винды, как бы задача сделать кросс-решение.
(хотя я еще не определился как оно должно выглядеть в конечном виде) вероятно придется править и виндовый код или вообще все перепишу.

Кстати я так и не нашел какой тип должен быть под pid в некоторых примерах указывают int, но чет сомневаюсь что там он, поэтому сделал как в винде unsigned long.
0
DrOffset
10346 / 5498 / 1359
Регистрация: 30.01.2014
Сообщений: 8,890
26.05.2015, 13:40 16
Я там "не" пропустил выше. Имелось в виду "это же не винда"
Цитата Сообщение от Avazart Посмотреть сообщение
Ну вообщето хотель бы что бы сигнатура выглядела так же как и для винды
Я обычно делаю так:
Под виндой никогда не используется char.
Под линуксом - никогда wchar_t.
Т.е. оборачивать в #ifdef _WIN32 сам typedef для строки, а не функции.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати я так и не нашел какой тип должен быть под pid
pid_t
1
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
26.05.2015, 21:31  [ТС] 17
Вероятно таки придется все же использовать "больше" самого Qt.

Если переходить к модулям:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
bool findModulesByProcId(unsigned long id, std::vector<tstring>& modules)
{
    DirGuard dg(opendir("/proc"));
    if(!dg.dir()) return 0;
 
    struct dirent *dirp= readdir(dg.dir());
    while(dirp)
    {
        unsigned long pid= atoi(dirp->d_name);
        if(pid==id)
        {
            std::stringstream cmdPath;
            cmdPath<<"/proc/"<<dirp->d_name<<"/maps";
 
            tifstream mapsFile(cmdPath.str().c_str());
            tstring module;
            while(getline(mapsFile,module,(tchar)0))  // \0
            {
              if(!module.empty())
                 modules.push_back(module);
            }
            return true;
        }
        dirp= readdir(dg.dir());
    }
 
    return false;
}
Получаю прибилизительно следующее:
Код
08048000-08051000 r-xp 00000000 08:05 401562     /home/******/Рабочий стол/MyTimerX
08051000-08052000 rw-p 00009000 08:05 401562     /home/******/Рабочий стол/MyTimerX
08959000-09251000 rw-p 00000000 00:00 0          [heap]
af187000-af1a6000 r-xp 00000000 08:05 135513     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstdecodebin2.so
af1a6000-af1a7000 r--p 0001f000 08:05 135513     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstdecodebin2.so
af1a7000-af1a8000 rw-p 00020000 08:05 135513     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstdecodebin2.so
af1a8000-af208000 rw-s 00000000 00:04 10387488   /SYSV00000000 (deleted)
af208000-af22f000 rw-s 00000000 00:04 10354719   /SYSV00000000 (deleted)
af22f000-af23a000 r-xp 00000000 08:05 786501     /lib/i386-linux-gnu/i686/cmov/libnss_files-2.19.so
af23a000-af23b000 r--p 0000a000 08:05 786501     /lib/i386-linux-gnu/i686/cmov/libnss_files-2.19.so
af23b000-af23c000 rw-p 0000b000 08:05 786501     /lib/i386-linux-gnu/i686/cmov/libnss_files-2.19.so
af23c000-af246000 r-xp 00000000 08:05 786505     /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.19.so
af246000-af247000 r--p 00009000 08:05 786505     /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.19.so
af247000-af248000 rw-p 0000a000 08:05 786505     /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.19.so
af255000-af25b000 rw-p 00000000 00:00 0 
af25b000-af263000 r--p 00000000 08:05 796337     /usr/share/locale/ru/LC_MESSAGES/gdk-pixbuf.mo
af263000-af2ba000 r--p 00000000 08:05 656726     /usr/share/fonts/truetype/dejavu/DejaVuSans-ExtraLight.ttf
af2ba000-af2cc000 r-xp 00000000 08:05 133331     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstxvimagesink.so
af2cc000-af2cd000 r--p 00011000 08:05 133331     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstxvimagesink.so
af2cd000-af2ce000 rw-p 00012000 08:05 133331     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstxvimagesink.so
af2ce000-af31e000 r-xp 00000000 08:05 135515     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstffmpegcolorspace.so
af31e000-af31f000 r--p 0004f000 08:05 135515     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstffmpegcolorspace.so
af31f000-af321000 rw-p 00050000 08:05 135515     /usr/lib/i386-linux-gnu/gstreamer-0.10/libgstffmpegcolorspace.so

...

b61b7000-b66dd000 r-xp 00000000 08:05 307907     /opt/Qt/5.4/gcc/lib/libQt5Core.so.5.4.1
b66dd000-b66e3000 r--p 00525000 08:05 307907     /opt/Qt/5.4/gcc/lib/libQt5Core.so.5.4.1
b66e3000-b66f7000 rw-p 0052b000 08:05 307907     /opt/Qt/5.4/gcc/lib/libQt5Core.so.5.4.1
b66f7000-b66fb000 rw-p 00000000 00:00 0 
b66fb000-b6857000 r-xp 00000000 08:05 307917     /opt/Qt/5.4/gcc/lib/libQt5Network.so.5.4.1
b6857000-b685a000 r--p 0015c000 08:05 307917     /opt/Qt/5.4/gcc/lib/libQt5Network.so.5.4.1
b685a000-b6861000 rw-p 0015f000 08:05 307917     /opt/Qt/5.4/gcc/lib/libQt5Network.so.5.4.1
b6861000-b6862000 rw-p 00000000 00:00 0 
b6862000-b6e1a000 r-xp 00000000 08:05 307912     /opt/Qt/5.4/gcc/lib/libQt5Gui.so.5.4.1
b6e1a000-b6e1b000 ---p 005b8000 08:05 307912     /opt/Qt/5.4/gcc/lib/libQt5Gui.so.5.4.1
b6e1b000-b6e28000 r--p 005b8000 08:05 307912     /opt/Qt/5.4/gcc/lib/libQt5Gui.so.5.4.1
b6e28000-b6e37000 rw-p 005c5000 08:05 307912     /opt/Qt/5.4/gcc/lib/libQt5Gui.so.5.4.1
b6e37000-b6e38000 rw-p 00000000 00:00 0 
b6e38000-b6f06000 r-xp 00000000 08:05 307914     /opt/Qt/5.4/gcc/lib/libQt5Multimedia.so.5.4.1
b6f06000-b6f07000 ---p 000ce000 08:05 307914     /opt/Qt/5.4/gcc/lib/libQt5Multimedia.so.5.4.1
b6f07000-b6f0b000 r--p 000ce000 08:05 307914     /opt/Qt/5.4/gcc/lib/libQt5Multimedia.so.5.4.1
b6f0b000-b6f16000 rw-p 000d2000 08:05 307914     /opt/Qt/5.4/gcc/lib/libQt5Multimedia.so.5.4.1
b6f16000-b7559000 r-xp 00000000 08:05 307931     /opt/Qt/5.4/gcc/lib/libQt5Widgets.so.5.4.1
b7559000-b7572000 r--p 00642000 08:05 307931     /opt/Qt/5.4/gcc/lib/libQt5Widgets.so.5.4.1
b7572000-b7590000 rw-p 0065b000 08:05 307931     /opt/Qt/5.4/gcc/lib/libQt5Widgets.so.5.4.1
b7590000-b7591000 rw-p 00000000 00:00 0 
b7591000-b76de000 r-xp 00000000 08:05 135845     /usr/lib/i386-linux-gnu/libX11.so.6.3.0
b76de000-b76e0000 r--p 0014d000 08:05 135845     /usr/lib/i386-linux-gnu/libX11.so.6.3.0
b76e0000-b76e3000 rw-p 0014f000 08:05 135845     /usr/lib/i386-linux-gnu/libX11.so.6.3.0
b76e3000-b76e5000 r-xp 00000000 08:05 135884     /usr/lib/i386-linux-gnu/libXss.so.1.0.0
b76e5000-b76e6000 rw-p 00001000 08:05 135884     /usr/lib/i386-linux-gnu/libXss.so.1.0.0
b76e6000-b76e7000 r--s 00000000 08:05 269881     /var/cache/fontconfig/4794a0821666d79190d59a36cb4f44b5-le32d4.cache-4
b76e7000-b76e9000 r--s 00000000 08:05 269884     /var/cache/fontconfig/e13b20fdb08344e0e664864cc2ede53d-le32d4.cache-4
b76e9000-b76f3000 r-xp 00000000 08:05 135882     /usr/lib/i386-linux-gnu/libXrender.so.1.3.0
b76f3000-b76f4000 r--p 00009000 08:05 135882     /usr/lib/i386-linux-gnu/libXrender.so.1.3.0
b76f4000-b76f5000 rw-p 0000a000 08:05 135882     /usr/lib/i386-linux-gnu/libXrender.so.1.3.0
b76f5000-b76fd000 rw-p 00000000 00:00 0 
b76fd000-b76fe000 rw-p 00000000 00:00 0 
b76fe000-b76ff000 r--p 00000000 00:00 0 
b76ff000-b7700000 rw-p 00000000 00:00 0 
b7700000-b7701000 r--p 00000000 00:00 0 
b7701000-b7703000 rw-p 00000000 00:00 0 
b7703000-b7704000 r-xp 00000000 00:00 0          [vdso]
b7704000-b7706000 r--p 00000000 00:00 0          [vvar]
b7706000-b7715000 r-xp 00000000 08:05 786520     /lib/i386-linux-gnu/ld-2.19.so
b7715000-b7716000 r-xp 0000f000 08:05 786520     /lib/i386-linux-gnu/ld-2.19.so
b7716000-b7725000 r-xp 00010000 08:05 786520     /lib/i386-linux-gnu/ld-2.19.so
b7725000-b7726000 r--p 0001f000 08:05 786520     /lib/i386-linux-gnu/ld-2.19.so
b7726000-b7727000 rw-p 00020000 08:05 786520     /lib/i386-linux-gnu/ld-2.19.so
bfe9c000-bfebc000 rwxp 00000000 00:00 0          [stack]
bfebc000-bfebd000 rw-p 00000000 00:00 0


Добавлено через 2 минуты
Цитата Сообщение от retmas Посмотреть сообщение
пропарсите /proc/[pid]/maps . формат там простой.
Сообственно, не совсем простой, точнее сказать не очевидный.

Добавлено через 7 часов 1 минуту
Переделал все с использованием Qt:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QTextStream>
#include <QRegExp>
 
 
#ifdef Q_OS_LINUX
  typedef pid_t PidType;
#elif Q_OS_WIN
  typedef DWORD PidType;
#endif
 
 
PidType findProcessByName(const QString& processName,bool* ok= 0)
{
    QDir procDir("/proc");
    QStringList files= procDir.entryList();
    foreach(QString fileName,files)
    {
       bool isProcFile= false;
       PidType pid= fileName.toInt(&isProcFile);
       if(isProcFile)
       {
         QFile cmdLineFile("/proc/"+fileName+"/cmdline");
         if(!cmdLineFile.open( QIODevice::ReadOnly| QIODevice::Text))
         {
           *ok= false;
           return -1;
         }
 
         QString line= cmdLineFile.readLine().trimmed();
         if(!line.isEmpty() && line==processName)
         {
           *ok= true;
           return pid;
         }
       }
    }
    *ok= false;
    return -1;
}
 
bool findModulesByProcId(PidType pid, QStringList& modules)
{
    QDir procDir("/proc");
    QStringList files= procDir.entryList();
    foreach(QString fileName,files)
    {
        bool isProcFile= false;
        PidType id= fileName.toInt(&isProcFile);
        if(isProcFile && id== pid)
        {
           QFile mapsFile("/proc/"+fileName+"/maps");
           if(!mapsFile.open(QIODevice::ReadOnly| QIODevice::Text))
              return false;
 
           // exemples :
           //b75cf000-b75e8000 r--p 00642000 08:05 307931     /opt/Qt/5.4/gcc/lib/libQt5Widgets.so.5.4.1
           //b7606000-b7607000 rw-p 00000000 00:00 0
           //b7779000-b777a000 r-xp 00000000 00:00 0          [vdso]
           //b777a000-b777c000 r--p 00000000 00:00 0          [vvar]
 
           QRegExp re("[0-9a-f]{8}-[0-9a-f]{8}\\s"
                      "\\D{4}\\s"
                      "[0-9a-f]{8}\\s"
                      "\\d{2}:\\d{2}\\s"
                      "\\d+\\s+"
                      "(/.*\\.so(\\.\\d+){0,3})");
 
           QTextStream in(&mapsFile);
           QString line= in.readLine();
           while(!line.isNull())
           {
             if(re.exactMatch(line))
                modules.append(re.cap(1));
             //else
             //   qDebug()<<line;
 
             line= in.readLine();
           }
 
           modules.removeDuplicates();
           return true;
        }
    }
   return false;
}
Так что остается только вопрос с поиском окна/процесса по заданным координатам.
0
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
10.06.2015, 21:57  [ТС] 18
Цитата Сообщение от Avazart Посмотреть сообщение
Так что остается только вопрос с поиском окна/процесса по заданным координатам.
Впринципе решено Поиск окна под курсором

Но обнаружилась другая проблема: функция
C++
1
PidType findProcessByName(const QString& processName,bool* ok= 0)
которая ищет id-процесc по пути к файлу в /proc/[id]/cmdline не находит процесс, если он был запущен к примеру из shell скрипта.

Добавлено через 1 час 2 минуты
Решено взятием пути из симлинка /proс/[id]/exe
C++ (Qt)
1
QString fileName= QFile::symLinkTarget("/proc/"+pidFileName+"/exe");
http://doc.qt.io/qt-5/qfile.html#symLinkTarget
0
10.06.2015, 21:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2015, 21:57

Получить список модулей указанного процесса
Доброго времени суток. Возникла проблема с получением списка модулей процесса. Пытаюсь получить...

Получить список модулей 64-битного процесса из 32-битной программы
Всех с наступившим Новым Годом! В своей программе мне нужно получить список модулей загруженных в...

Завершение конкретного процесса из множества копий
Добрый день. Помогите пожалуйста с реализацией такого функционала. Есть 10 папок с одинаковыми...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru