2010-03-18 2 views
7

У меня вопрос об отладке запущенной программы на C++ в Linux. Если программирование уже запущено и не может быть прервано, как это сделать.Как отладить запущенную программу на C++ в Linux?

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

1) мы можем использовать GDB, указав идентификатор процесса

gdb -p PID 

В этом случае, в чем разница между этим и attach PID?

2) Мы можем использовать PSTAT, однако, я использую Ubuntu, не PSTAT, но только mpstat

, кажется, что mpstat не дает слишком много информации, и не так много вариантов.

3) проверить информацию детали в директории ./proc

В этом случае, просто перейдите в каталог с PID. Однако, если это делается на людях?

+0

Я не думаю, что я когда-либо видел '-p' вариант. Тем не менее, при подключении к процессу с помощью PID. В чем проблема с этим? – Cascabel

+0

Я не уверен, каков ваш вопрос. У вас, похоже, уже есть методы работы для отладки программы на C++, поэтому ваш заголовок отвечает на себя, а затем ваше тело сообщения спрашивает что-то несвязанное. Можете ли вы перефразировать заголовок или ваш вопрос, чтобы быть более четким? – ephemient

+0

Я использовал 'strace -p PID' для отслеживания системных вызовов запущенного приложения C++. Я обнаружил, что вызов 'open()' был неудачным, и ошибка была обработана надлежащим образом. – jschmier

ответ

2

Невозможно найти -p вариант в gdb man или их документацию, но он действительно работает! Я много раз пробовал его с более старыми версиями на RedHat и 7.0.1 на Debian.

Я не уверен, как именно он находит exe PID (возможно, /proc/<PID>/exe), но это так. Поскольку это не описано в их документации, возможно, это не самый рекомендуемый способ, но у меня не было никаких проблем с ним.

Нет заметной разницы между gdb -p <PID> и бегущим gdb и в их оболочке, набрав attach <PID>.

Я лично предпочитаю ps xa| grep myprogram для получения PID

1

В отношении техники 1, нет -p флага, и вы все еще нужны название программы:

gdb prog PID 

Там нет никакой разницы между делать это против запуска gdb prog, а затем говорить GDB attach pid.

1

Используйте ps -ef | grep <your program>, чтобы получить PID. Затем запустите gdb <your program> <PID>. pstat не является стандартной командой. Я использовал его только с Solaris.

например.

[email protected]:~/FE/bin> ./fe& 
[1] 5866         
[email protected]:~/FE/bin> ps -ef | grep fe 
gayan  5866 5836 2 10:19 pts/3 00:00:00 ./fe 
gayan  5871 5836 0 10:19 pts/3 00:00:00 grep fe 
[email protected]:~/FE/bin> gdb fe 5866 
GNU gdb (GDB; openSUSE 11.1) 6.8.50.20081120-cvs  
Copyright (C) 2008 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it.   
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details.            
This GDB was configured as "i586-suse-linux".         
For bug reporting instructions, please see:         
<http://bugs.opensuse.org/>...            
Attaching to program: /home/gayan/FE/bin/fe, process 5866 

Вышеупомянутый был запущен на openSuse, но должен работать на Ubuntu.

Смежные вопросы