How to pass arguments to a python gdb script launched from command line

◇◆丶佛笑我妖孽 提交于 2019-12-06 09:29:00

问题


I'd like to pass some command line arguments to a python script run via gdb command, but importing the gdb module in python removes the argv attribute from sys. How do I access arg1 and arg2 within my python script shown in my example?

Command line execution:

$ gdb -x a.py --args python -arg1 -arg2

a.py:

#!/usr/bin/env python
import gdb
import sys
print('The args are: {0}'.format(sys.argv))
gdb.execute('quit')

Error raised:

AttributeError: 'module' object has no attribute 'argv'

Versions:

  • GNU gdb (GDB) 7.2
  • Python 2.6.6

Edit:

The end target I'll be debugging is a C executable that is already running, so I'll be attaching to it later in the script, so gdb -x a.py --args python -arg1 -arg2 is not correct either since the python part prints a gdb error: Reading symbols from /usr/bin/python...(no debugging symbols found)...done....


回答1:


-ex py

This is a possibility:

argv.py:

print(arg0)
print(arg1)

Invocation:

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

Then you could wrap that in the following script:

#!/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"



回答2:


It's not totally clear to me what you are trying to do.

An invocation of the form:

gdb --args something arg arg

Tells gdb to use something as the program to be debugged, with arg arg as the initial command-line arguments for the run command. You can inspect these inside gdb with show args.

So, your command is saying "I want to debug the python executable, passing it some arguments".

However, later you say you plan to attach to some already-running executable.

So, I think you're probably trying to script gdb in Python -- not debug the python executable.

The good news is, this is possible, just not the way you've written it. Instead you have a couple choices:

  • Make a .py file holding your script and tell gdb to source it, e.g., with gdb -x myscript.py (which you've already done...)

  • Use -ex to invoke some Python explicitly, like -ex 'python print 23'.



来源:https://stackoverflow.com/questions/29992153/how-to-pass-arguments-to-a-python-gdb-script-launched-from-command-line

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!