LINUX.ORG.RU

gdb: script с вызовом С функции + подмена инициализации переменных

 , ,


1

2

Привет,

Как из под консоли Linux через gdb одной командой вызвать функцию в работающей программе, в ней по своему инициализировать ее локальные переменные (не как в сорцах) и вернуть управление консоли?

пробую так:

$ sudo gdb -p `pidof a.out` -x ./gdbinit
$ cat ./gdbinit
set pagination off
set confirm off

b 1.c:28
command 1
  if i%7 == 0
    set val=true
    continue
  else
    continue
  end
end

call func()
continue
detach
quit

в таком виде gdb требует ввода continue, detach, quit. Модификации вида:

$ sudo gdb -p `pidof a.out` -x ./gdbinit -ex "call func()" -ex "continue" -ex "detach" -ex "quit"
приводят к преждевременному выходу из gdb и падениям проги, и заскриптовать не получается.

PS. GNU gdb (GDB) 7.6.2; gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1)



Последнее исправление: kvazisto (всего исправлений: 2)

Ответ на: комментарий от mittorn

не помогает, требует по прежнему интерактива (ввода continue, detach, quit)

$ cat ./gdbinit
set pagination off
set confirm off

attach 26999

b 1.c:28
command 1
  if i%7 == 0
    set val=true
    continue
  else
    continue
  end
end

call func()
continue
detach
quit
$ sudo gdb -x ./gdbinit

А вообще можно ли вызывать ф-и из файла? Просто смущает вывод gdb, указывающий на строку с «call func()»

./gdbinit:14: Error in sourced command file: The program being debugged stopped while in a function called from GDB. Evaluation of the expression containing the function (func_for_trace()) will be abandoned. When the function is done executing, GDB will silently stop.

kvazisto
() автор топика
Ответ на: комментарий от kvazisto

Нельзя делать брекпоинт внутри функции. Попробуй через jump вызвать если это поможет.

mittorn ★★★★★
()

короче я нашел, вот так все работает с изначальным скриптом:

sudo gdb -p `pidof a.out` < ./gdbinit

kvazisto
() автор топика
Ответ на: комментарий от mittorn

а как jump использовать, если в текущий момент мы в другой функции? Jump же повлияет на ход выполнения программы, а мне просто надо вызвать функцию, скажем очистки памяти, и продолжить выполнение с точки останова.

jump 1.c:23
приводит к Segmentation fault.

Нельзя делать брекпоинт внутри функции

а почему, тем более если все работает?

kvazisto
() автор топика
Ответ на: комментарий от mittorn

убрал брекпоинт, и все прошло и правда без ошибок и четко по скрипту! Совсем не понятно чем обычный брекпоинт в скрипте был плох, и где про это написано.

А куда/как можно jump вставить в моем случае? Или нельзя?

kvazisto
() автор топика
Ответ на: комментарий от mittorn

как jump использовать в моей задаче так и не допер. Но спасибо!

kvazisto
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.