linux tutorial gdb останавливается в командном файле, если есть ошибка. Как продолжить, несмотря на ошибку?




linux where core dump file (4)

Я мой настоящий скрипт gdb, анализируя основной файл, я пытаюсь разыменовать указатель и получить «Ошибка в файле командной строки: не удается получить доступ к памяти по адресу», а затем останавливается мой скрипт gdb. То, что я хочу, это просто выполнить скрипт gdb без остановки. Является ли это возможным?

Это тестовая программа и тестовый скрипт gdb, который демонстрирует мою проблему. В этой ситуации указатель имеет значение NULL, но в реальной ситуации указатель будет иметь недействительное недопустимое значение.

Это тестовая программа C:

#include <stdio.h>
struct my_struct {
  int v1;
  int v2;
};

int main()
{
  my_struct *p;
  printf("%d %d\n", p->v1, p->v2);
  return 0;
}

Это тестовый скрипт gdb:

>cat analyze.gdb
p p->v1
q

И это демонстрация проблемы (что я хочу от gdb здесь, чтобы получить это сообщение об ошибке, а затем перейти к команде завершения процесса):

>gdb -silent a.out ./core.22384 -x ./analyze.gdb
Reading symbols from /a.out...done.
[New Thread 22384]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400598 in main () at main.cpp:11
11        printf("%d %d\n", p->v1, p->v2);
./analyze.gdb:1: Error in sourced command file:
Cannot access memory at address 0x0
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64

Обновить
Благодаря Тому. Это скрипт gdb, который обрабатывает эту проблему:

>cat ./analyze.v2.gdb
python
def my_ignore_errors(arg):
  try:
    gdb.execute("print \"" + "Executing command: " + arg + "\"")
    gdb.execute (arg)
  except:
    gdb.execute("print \"" + "ERROR: " + arg + "\"")
    pass

my_ignore_errors("p p")
my_ignore_errors("p p->v1")
gdb.execute("quit")

Вот как это работает:

>gdb -silent ./a.out -x ./analyze.v2.gdb -c ./core.15045
Reading symbols from /import/home/a.out...done.
[New Thread 15045]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400598 in main () at main.cpp:11
11        printf("%d %d\n", p->v1, p->v2);
$1 = "Executing command: p p"
$2 = (my_struct *) 0x0
$3 = "Executing command: p p->v1"
$4 = "ERROR: p p->v1"
$5 = "Executing command: quit"

Если вы просто хотите выйти, если возникнет какая-либо ошибка, вы можете использовать -batch gdb :

Выполнить в пакетном режиме. Выйдите со статусом 0 после обработки всех файлов команд, указанных с помощью « -x » (и всех команд из файлов инициализации, если они не заблокированы « -n »). Выход с ненулевым статусом, если возникает ошибка при выполнении команд GDB в командных файлах. [...]


Командный язык gdb не имеет возможности игнорировать ошибку при обработке команды.

Это легко сделать, однако, если ваш gdb был построен с расширением Python. Найдите сценарий «игнорировать-ошибки». При этом вы можете:

(gdb) ignore-errors print * foo

... и будут отображаться любые ошибки из печати, но не прерывать остальную часть вашего скрипта.


Вы также можете сделать это:

gdb a.out < analyze.v2.gdb 

Это приведет к выполнению команд в файле analy.v2.gdb по строкам, даже если возникает ошибка.


Я не думаю, что это возможно, поскольку выполнение зависит от указателя. Однако вы могли бы назначить новое значение указателю при ударе этой ошибки, например, set yourPointer = <another object of the same type> . Затем ваша программа может использовать разыменованное значение.





coredump