जीडीबी में कई कमांडों को किसी प्रकार के सीमांकक द्वारा अलग किया गया है? '?'


144

मैं एक बार में gdb में दो कमांड निष्पादित करने का प्रयास कर रहा हूं:

finish; next

मैंने '' का उपयोग करने की कोशिश की आदेशों को अलग करने के लिए लेकिन gdb ने मुझे एक बार में दोनों नहीं करने दिया।

क्या यह संभव है कि gdb में कई कमांड्स को bash कमांड के द्वारा अलग किया जाए ';' सीमांकक?

जवाबों:


179

मैं ऐसा नहीं मानता (लेकिन मैं गलत हो सकता हूं)। आप ऐसा कुछ कर सकते हैं:

(gdb) fn को परिभाषित करें
> खत्म
> अगला
> अंत

और फिर बस टाइप करें:

(gdb) एफ.एन.

आप इसे अपनी ~/.gdbinitफ़ाइल में भी डाल सकते हैं ताकि यह हमेशा उपलब्ध रहे।


1
खराब विधि जब gdb को इनवोक के स्टैकट्रेस को प्रिंट करने के लिए आमंत्रित किया जाता है: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...और मैं पेजिनेशन को बंद नहीं कर सकता।
वि।

4
और अगर आप भूल जाते हैं कि आपने किसी फ़ंक्शन को कैसे परिभाषित किया है, तो आप show user <function name>इसके स्रोत को देखने के लिए उपयोग कर सकते हैं , जैसे show user fn
ntc2

44

यदि आप कमांड लाइन से gdb चला रहे हैं, तो आप कई कमांड पास कर सकते हैं जैसे -एक्स पैरामीटर:

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

डिस्प्ले और अन्य कमांड के साथ यह युग्मित चल रहा है gdb को कम बोझिल बनाता है।


10

GDB में ऐसा कोई कमांड विभाजक वर्ण नहीं है। मैंने संक्षेप में देखा, मामले में एक को जोड़ना आसान होगा, लेकिन दुर्भाग्य से नहीं ...।


5

आप अजगर एकीकरण का उपयोग करके ऐसा कर सकते हैं gdb

यह अच्छा होगा अगर s ; btकदम रखा जाए और फिर एक बैकट्रेस प्रिंट किया जाए, लेकिन यह नहीं है।

आप पायथन दुभाषिया में कॉल करके एक ही बात को पूरा कर सकते हैं।

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

इसे एक समर्पित कमांड में लपेटना संभव है, यहां "सेमी" कहा जाता है, जिसे अजगर परिभाषा द्वारा समर्थित किया गया है।

यहां .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

शानदार, क्योंकि यह क्लिपबोर्ड से कमांड पेस्ट करने और इसे निष्पादित करने की अनुमति देता है।
जीन फ़्राँस्वा Fabre

0

मैं एक अन्य तरीके से GDB में कई कमांड करने के लिए एक Bash HERE दस्तावेज़ का उपयोग करके भागा ।

उदाहरण:

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

इसका सीमित मूल्य / प्रयोज्य IMO है क्योंकि GDB आदेशों की सूची को निष्पादित करने के बाद चलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.