Удаленная отладка GDB: заставить GDB ждать запуска gdbserver

Обычный способ удаленной отладки, который я знаю, - это запустить gdbserver на целевом сервере, а затем удаленно подключиться из gdb (с помощью целевого пульта).

Но возможно ли, чтобы GDB ждал на порту, пока на этом порту не появится gdbserver?

Заранее спасибо.


person user98158    schedule 27.02.2015    source источник


Ответы (2)


Вы можете сделать это с помощью небольшого количества кода на Python. gdb.execute("command ...") вызовет исключение python, если команда получит ошибку. Таким образом, мы можем заставить python запускать команду target remote host:port несколько раз, пока он не получит ошибку тайм-аута (которая должна напоминать host:port: Connection timed out.).

Поместите следующее в файл и используйте команду gdb source, чтобы прочитать ее. Она определит новую подкоманду target waitremote host:port.

define target waitremote
python connectwithwait("$arg0")
end

document target waitremote
Use a remote gdbserver, waiting until it's connected.
end

python
def connectwithwait(hostandport):
  while 1:
    try:
      gdb.execute("target remote " + hostandport)
      return True
    except gdb.error, e:
      if "Connection timed out" in str(e):
        print "timed out, retrying"
        continue
      else:
        print "Cannot connect: " + str(e)
        return e
end
person Mark Plotnick    schedule 27.02.2015
comment
Спасибо, это вариант лучше. - person user98158; 13.03.2015

В нем нет ничего встроенного, но я думаю, что есть пара способов заставить его работать.

Один из них - запускать gdbserver по запросу на целевом объекте, скажем, из inetd или аналогичного.

Другой - запустить прокси на целевом сервере и заставить прокси принять соединение, но в остальном ничего не делать, пока gdbserver не будет готов. Однако я не уверен, что это приведет к проблемам с тайм-аутом на стороне gdb.

person Tom Tromey    schedule 27.02.2015