Nhiều lệnh trong gdb được phân tách bằng một số loại dấu phân cách ';'?


144

Tôi đang cố gắng thực hiện hai lệnh cùng một lúc trong gdb:

finish; next

Tôi đã thử sử dụng ';' để tách các lệnh nhưng gdb không cho phép tôi thực hiện cả hai cùng một lúc.

Có thể thực hiện nhiều lệnh trong gdb tương tự như các lệnh bash được phân tách bằng ';' phân định?

Câu trả lời:


179

Tôi không tin như vậy (nhưng tôi có thể sai). Bạn có thể làm một cái gì đó như thế này:

(gdb) xác định fn
> kết thúc
> tiếp theo
> kết thúc

Và sau đó chỉ cần gõ:

(gdb) fn

Bạn cũng có thể đặt nó trong ~/.gdbinittập tin của bạn để nó luôn có sẵn.


1
Phương thức xấu khi gdb được gọi chỉ để in stacktrace của invoker: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...và tôi không thể tắt phân trang.
Vi.

4
Và nếu bạn quên cách bạn đã xác định một hàm, bạn có thể sử dụng show user <function name>để xem nguồn của nó, vd show user fn.
ntc2

44

Nếu bạn đang chạy gdb từ dòng lệnh, bạn có thể truyền nhiều lệnh với tham số -ex như:

$ gdb ./prog -ex 'b srcfile.c:90' -ex 'b somefunc' -ex 'r -p arg1 -q arg2'

Điều này kết hợp với hiển thị và các lệnh khác làm cho việc chạy gdb trở nên ít cồng kềnh hơn.


10

GDB không có ký tự phân tách lệnh như vậy. Tôi nhìn sơ qua, trong trường hợp có thể dễ dàng thêm một cái, nhưng tiếc là không ....


5

Bạn có thể làm điều này bằng cách sử dụng tích hợp python trong gdb .

Sẽ thật tuyệt nếu s ; bt bước và sau đó in một backtrace, nhưng nó không.

Bạn có thể thực hiện điều tương tự bằng cách gọi vào trình thông dịch Python.

python import gdb ; print(gdb.execute("s")) ; print(gdb.execute("bt"))

Có thể gói nó thành một lệnh chuyên dụng, ở đây được gọi là "cmds", được hỗ trợ bởi một định nghĩa python.

Đây là một ví dụ được .gdbinitmở rộng với một chức năng để chạy nhiều lệnh.

# multiple commands
python
from __future__ import print_function
import gdb


class Cmds(gdb.Command):
  """run multiple commands separated by ';'"""
  def __init__(self):
    gdb.Command.__init__(
      self,
      "cmds",
      gdb.COMMAND_DATA,
      gdb.COMPLETE_SYMBOL,
      True,
    )

  def invoke(self, arg, from_tty):
    for fragment in arg.split(';'):
      # from_tty is passed in from invoke.
      # These commands should be considered interactive if the command
      # that invoked them is interactive.
      # to_string is false. We just want to write the output of the commands, not capture it.
      gdb.execute(fragment, from_tty=from_tty, to_string=False)
      print()


Cmds()
end

ví dụ gọi:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye

rực rỡ, vì nó cho phép dán lệnh từ clipboard và thực thi nó.
Jean-François Fabre

0

tôi đã chạy qua một cách khác để thực hiện nhiều lệnh trong GDB bằng tài liệu Bash TẠI ĐÂY.

thí dụ:

cat << EOF | gdb
print "command_1"
print "..."
print "command_n"
EOF

điều này có giá trị giới hạn / khả năng sử dụng IMO vì GDB thoát sau khi thực hiện danh sách các lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.