คำสั่งหลายคำสั่งใน gdb คั่นด้วยตัวคั่นบางตัว ';'?


144

ฉันพยายามรันสองคำสั่งพร้อมกันใน gdb:

finish; next

ฉันลองใช้ ';' เพื่อแยกคำสั่ง แต่ gdb ไม่ให้ฉันทำทั้งสองอย่างพร้อมกัน

เป็นไปได้ไหมที่จะทำหลาย ๆ คำสั่งใน gdb คล้ายกับคำสั่ง bash โดยคั่นด้วย ';' คั่น?

คำตอบ:


179

ฉันไม่เชื่อเช่นนั้น (แต่ฉันอาจผิด) คุณสามารถทำสิ่งนี้:

(gdb) กำหนด fn
> เสร็จสิ้น
> ถัดไป
> สิ้นสุด

จากนั้นเพียงพิมพ์:

(gdb) fn

คุณสามารถใส่มันลงใน~/.gdbinitไฟล์ของคุณได้เช่นกัน


1
วิธีการที่ไม่ถูกต้องเมื่อ gdb ถูกเรียกใช้เพียงเพื่อพิมพ์ stacktrace ของผู้เรียก: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...และฉันไม่สามารถปิดการแบ่งหน้า
วิ

4
และถ้าคุณลืมวิธีการที่คุณกำหนดฟังก์ชั่นที่คุณสามารถใช้เพื่อดูแหล่งที่มาเช่นshow user <function name> show user fn
ntc2

44

หากคุณใช้ gdb จากบรรทัดคำสั่งคุณสามารถส่งคำสั่งหลายคำสั่งด้วยพารามิเตอร์ -ex เช่น:

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

ควบคู่ไปกับคำสั่งการแสดงผลและอื่น ๆ ทำให้การเรียกใช้ gdb ยุ่งยากน้อยลง


10

GDB ไม่มีตัวคั่นคำสั่งดังกล่าว ฉันดูสั้น ๆ ในกรณีที่มันจะง่ายต่อการเพิ่มหนึ่ง แต่น่าเสียดายที่ไม่มี ....


5

gdbคุณสามารถทำได้โดยใช้การรวมหลามใน

มันจะดีถ้าs ; btเหยียบแล้วพิมพ์ย้อนหลัง แต่ไม่

คุณสามารถทำสิ่งเดียวกันให้สำเร็จโดยการเรียกไปที่ล่าม Python

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

เป็นไปได้ที่จะรวมคำสั่งนี้เข้าไปในคำสั่งเฉพาะเรียกว่า "cmds" ซึ่งได้รับการสนับสนุนโดยคำจำกัดความของ python

นี่คือตัวอย่างที่.gdbinitขยายออกมาพร้อมกับฟังก์ชั่นเพื่อเรียกใช้หลายคำสั่ง

# 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

ตัวอย่างการร้องขอ:

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

สุกใสมันช่วยให้สามารถวางคำสั่งจากคลิปบอร์ดและดำเนินการได้
Jean-François Fabre

0

ฉันใช้วิธีอื่นเพื่อทำหลายคำสั่งใน GDB โดยใช้เอกสาร Bash HERE

ตัวอย่าง:

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

สิ่งนี้มีค่า / การใช้งาน IMO จำกัด เนื่องจาก GDB หยุดทำงานหลังจากเรียกใช้รายการคำสั่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.