Я пытаюсь подключить существующий процесс, запустить несколько команд и распечатать необходимую информацию. Однако когда я это делаю, я вижу, что PID процесса изменяется (с отображением команды killed).


Код

     1  #include <iostream>
     2  #include <unistd.h>
     3  using namespace std;
     4
     5
     6  int main()
     7  {
     8      do
     9      {
    10          static int s = 100;
    11          s = s+1;
    12          sleep (3);
    13      } while(1);
    14      return 0;
    15  }
    16

Команды GDB

> cat /tmp/command.txt    
set pagination off
set logging file /home/testgrp/gdb.txt
set logging on
b sample.cc:11
commands 1
    p s
end
run 1
quit

Выход

root@198.18.81.198:/desktop/user1/workspace# ps -eaf | grep out
root     16724  8877  0 08:25 pts/1    00:00:00 grep --color=auto out
root@198.18.81.198:/desktop/user1/workspace# cat /home/testgrp/gdb.txt
cat: /home/testgrp/gdb.txt: No such file or directory
root@198.18.81.198:/desktop/user1/workspace# ./a.out &
[1] 16762
root@198.18.81.198:/desktop/user1/workspace# gdb --batch-silent -x=/tmp/command.txt -p 16762
[1]+  Killed                  ./a.out
root@198.18.81.198:/desktop/user1/workspace# ps -eaf | grep out
root     16805     1  0 08:25 pts/1    00:00:00 /desktop/user1/workspace/a.out 1
root     16823  8877  0 08:25 pts/1    00:00:00 grep --color=auto out
root@198.18.81.198:/desktop/user1/workspace# cat /home/testgrp/gdb.txt
Breakpoint 1 at 0x400711: file sample.cc, line 11.
$1 = 100
A debugging session is active.

    Inferior 1 [process 16805] will be detached.

Quit anyway? (y or n) [answered Y; input not from terminal]

Вопрос

  1. Как получить необходимую информацию, не меняя PID процесса?
  2. Что еще более важно, почему изменяется pid, а предыдущий PID равен killed

Аппендикс

Версия GDB

GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2aka8.0.1) 7.7.1
Copyright (C) 2014 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 "x86_64-linux-gnu".
1
kumar_m_kiran 14 Ноя 2017 в 11:31

1 ответ

Лучший ответ

В последних двух строках ваших скриптов gdb

run 1
quit

«run 1» перезапустит отлаживаемую программу с аргументом «1». по умолчанию он должен попросить вас подтвердить перезагрузку или нет. Но у вас есть аргумент "--batch-silent" при запуске gdb. поэтому ваш процесс перезапускается без сообщения.

Удалите «--batch-silent» и последние 2 строки вашего сценария gdb, после чего вы сможете сломать и отладить. "b sample.cc:11" остановится в спящем режиме системной функции, вы можете изменить его на другую строку, если почувствуете путаницу. (Я рекомендую вам прочитать несколько более простых демонстраций перед использованием gdb, поэтому многие cmd позволят новичку запутаться)

4
peter__barnes 15 Ноя 2017 в 00:29