如何将参数传递给从命令行启动的python gdb脚本

如何将参数传递给从命令行启动的python gdb脚本,python,gdb,gdb-python,Python,Gdb,Gdb Python,我想将一些命令行参数传递给通过gdb命令运行的python脚本,但是在python中导入gdb模块会从sys中删除argv属性。如何在示例中显示的python脚本中访问arg1和arg2 命令行执行: a、 py: 出现错误: 版本: GNU gdb(gdb)7.2 Python 2.6.6 编辑: 我将调试的最终目标是一个已经在运行的C可执行文件,因此我将在稍后的脚本中附加到它,因此gdb-xa.py--args python-arg1-arg2也不正确,因为python部分打印了一个gd

我想将一些命令行参数传递给通过
gdb
命令运行的python脚本,但是在python中导入gdb模块会从sys中删除argv属性。如何在示例中显示的python脚本中访问arg1和arg2

命令行执行: a、 py: 出现错误: 版本:
  • GNU gdb(gdb)7.2
  • Python 2.6.6
编辑:
我将调试的最终目标是一个已经在运行的C可执行文件,因此我将在稍后的脚本中附加到它,因此
gdb-xa.py--args python-arg1-arg2
也不正确,因为
python
部分打印了一个gdb错误:
从/usr/bin/python读取符号…(未找到调试符号)…完成。
..

我不完全清楚你想做什么

对表单的调用:

gdb --args something arg arg
告诉gdb使用
something
作为要调试的程序,使用
arg arg
作为
run
命令的初始命令行参数。您可以使用
show args
在gdb内部检查这些参数

因此,您的命令是“我想调试
python
可执行文件,并向其传递一些参数”

但是,稍后您会说您计划将附加到一些已经运行的可执行文件

因此,我认为您可能正在尝试用Python编写gdb脚本——而不是调试
Python
可执行文件

好消息是,这是可能的,只是不是你写的方式。相反,您有两个选择:

  • 制作一个保存脚本的
    .py
    文件,并告诉gdb将其
    源代码
    保存,例如,使用
    gdb-x myscript.py
    (您已经完成了…)

  • 使用
    -ex
    显式调用一些Python,比如
    -ex'pythonprint23'


    • -ex-py

      这是一种可能性:

      argv.py

      print(arg0)
      print(arg1)
      
      调用:

      gdb --batch -ex 'py arg0 = 12;arg1 = 3.4' -x argv.py
      
      或相当于:

      gdb --batch -ex 'py arg0 = 12' -ex 'py arg1 = 3.4' -x argv.py
      
      输出:

      12
      3.4
      
      然后,您可以将其包装在以下脚本中:

      #!/usr/bin/env bash
      
      doc="
      Pass parameters to python script.
      
      Usage:
      
        $0 scrpit.py 1 2
      
      Where scrpit.py uses the arguments like:
      
        print(arg0)
        print(arg1)
      "
      
      py="$1"
      shift
      cli=''
      i=0
      for arg in $*; do
        cli="$cli -ex 'py arg$i = $arg'"
        i=$(($i+1))
      done
      eval gdb --batch $cli -x "$py"
      

      在Python 3.8.6、GDB 9.2、Ubuntu 20.10上进行测试。

      如果您使用它,您可能会在2中找到一些有用的东西或它的等价物。@AdamBorgo argparse是在Python 2.7版中添加的,我使用的是2.6,但是我最初尝试使用optparse,但它依赖于sys.argv。所以我把这一切归结为一个简单的问题。不过,谢谢你的建议(也许可以,只是在这个应用程序中不行)!这并不完全是您想要的,但是:如果您可以让
      a.py
      定义一个python函数,比如
      a
      ,那么您可以给gdb一个参数,例如
      -ex“python a('答案是',42)”
      @MarkPlotnick您的答案是我找到的最接近的解决方案。我不喜欢的是它的笨拙,我希望会有一个更直接的方法。这确实有效,谢谢你,但也许答案是它无法做到
      $gdb-ex“python导入os,sys;sys.path.append(os.getcwd());从导入*;main('arg1','arg2')”
      。我的最佳想法是编写一个helper bash脚本来启动a.py(我正在做的),但将命令行参数重定向到一个临时文件,a.py脚本从您的第一个建议中读取该临时文件是我想要完成的:
      $gdb-x a.py
      ,但我需要将命令行参数发送到此a.py脚本。py脚本最终附加到在后台运行的C程序上(不重要)。我不想只启动gdb
      $gdb
      ,然后稍后使用
      r
      命令,这是使用
      args
      时的假设,因为它需要程序名
      something
      作为初始参数。编写一个包装器脚本,该脚本接受您的参数,生成一个Python文件,然后适当地调用gdb;arg1=arg1;…'声明/分配,而不是将它们分成几个单独的语句,以
      -ex'py'
      @xinili谢谢,添加到答案中。突然的蟾蜍崇拜是伟大的!!!
      gdb --batch -ex 'py arg0 = 12' -ex 'py arg1 = 3.4' -x argv.py
      
      12
      3.4
      
      #!/usr/bin/env bash
      
      doc="
      Pass parameters to python script.
      
      Usage:
      
        $0 scrpit.py 1 2
      
      Where scrpit.py uses the arguments like:
      
        print(arg0)
        print(arg1)
      "
      
      py="$1"
      shift
      cli=''
      i=0
      for arg in $*; do
        cli="$cli -ex 'py arg$i = $arg'"
        i=$(($i+1))
      done
      eval gdb --batch $cli -x "$py"