如何将参数传递给从命令行启动的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
可执行文件
好消息是,这是可能的,只是不是你写的方式。相反,您有两个选择:
- 制作一个保存脚本的
文件,并告诉gdb将其.py
源代码
保存,例如,使用
(您已经完成了…)gdb-x myscript.py
- 使用
显式调用一些Python,比如-ex
-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"