Solo quería señalar algo que encuentro confuso cada vez que vuelvo a este tema (Nota, actualmente estoy en Ubuntu 14.04, GNU gdb (Ubuntu 7.7.1-0ubuntu5 ~ 14.04.3) 7.7.1):
en primer lugar, hay referencias acerca de ser "posible invocar gdb
como intérprete":
... sentido, se podría escribir un archivo de texto de la escritura con la línea shebang #!/usr/bin/gbd -P
o #!/usr/bin/gbd --python
, a continuación, escribir código Python en ella, y luego hacerlo ejecutable chmod +x pygdbscript
, a continuación, ejecute ./pygdbscript
; ... pero como en este post:
..., me sale gdb: unrecognized option '--python'
si intento algo por el estilo. Aparentemente esta opción es/era una característica en alguna rama "arquero" de gdb
?!
Por lo tanto, con el fin de ejecutar un script Python en gdb
, en realidad hay dos maneras:
- un nombre al archivo de script con la extensión
.py
; test.py
decir aquí:
def Something():
print("hello from python")
Something()
gdb.execute("quit");
Tenga en cuenta, en este caso, sólo hay que escribir código Python llanura; y no necesita import gdb
para acceder al objeto gdb
. Esto puede funcionar con cualquiera de:
gdb -x test.py
gdb -x=test.py
gdb --command test.py
gdb --command=test.py
gdb -command test.py
gdb -command=test.py
... que parecen ser equivalentes, como el resultado de cualquiera de estos es la misma impresión, antes de gdb
se instruye a la salida de la secuencia de comandos:
$ gdb -x=test.py
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
...
For help, type "help".
Type "apropos word" to search for commands related to "word".
hello from python
NOTA que para este caso, también nombres como test.gdb.py
se interpretarán como scripts puros de Python, desde entonces terminan en .py
.
- Nombre su script cualquier otra cosa - siempre y cuando se hace no
.py
extremo con la extensión; decir test.pygdb
aquí:
python
def Something():
print("hello from python")
Something()
gdb.execute("quit");
end
En este caso, gdb
interpreta el guión como un guión gdb
, es decir, con gdb
comandos - y eso significa, que todo lo que el código Python es posible que desee escribir aquí, obligada se envuelve en "python
" como línea de partida y "end
" al final del código de Python. Una vez más, sería llamado con cualquiera de estas llamadas equivalentes:
gdb -x test.pygdb
gdb -x=test.pygdb
gdb --command test.pygdb
gdb --command=test.pygdb
gdb -command test.pygdb
gdb -command=test.pygdb
... y entonces la salida es la misma que en el caso anterior (ya que es la misma secuencia de comandos de Python en ejecución):
$ gdb -x test.pygdb
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
...
hello from python
y en respuesta a OP: si el código C en OP está en /tmp/myprog.c
- con un int start_test() { return rand() % 50; }
añadido en la parte superior, de lo contrario no se compilará -, y se compila con la gcc -g myprog.c -o myprog.exe
en /tmp/myprog.exe
; entonces se puede usar un script myprog.gdb.py
así:
# need to specify the executable file which we debug (in this case, not from command line)
# here `gdb` command `file` is used - it does not have a Python equivalent (https://sourceware.org/gdb/onlinedocs/gdb/Objfiles-In-Python.html#index-Objfile_002eframe_005ffilters)
# so we must use gdb.execute:
myexefile="/tmp/myprog.exe"
print("""
### myprog.gdb.py is running: """ + myexefile + """ - and adding breakpoints:
""")
gdb.execute("file " + myexefile)
gdb.execute("set pagination off")
ax = gdb.Breakpoint("test_success")
bx = gdb.Breakpoint("test_failed")
gdb.execute("run")
# here the program will break, so we can do:
print("""
### myprog.gdb.py after the break - current stack frame:
""")
current_frame_at_break = gdb.selected_frame()
print(current_frame_at_break) # instead of gdb.execute("frame")
print("""
### myprog.gdb.py - backtrace:
""")
gdb.execute("backtrace 2")
print("""
### myprog.gdb.py - go to frame that called current frame:
""")
parent_frame = current_frame_at_break.older()
print(parent_frame)
status_var = parent_frame.read_var("status")
print("status_var is: ", status_var)
... a continuación, ejecutar este script con:
$ gdb -x myprog.gdb.py
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
....
For help, type "help".
Type "apropos word" to search for commands related to "word".
### myprog.gdb.py is running: /tmp/myprog.exe - and adding breakpoints:
Breakpoint 1 at 0x400565: file myprog.c, line 8.
Breakpoint 2 at 0x40055f: file myprog.c, line 4.
Breakpoint 2, test_failed() at myprog.c:4
4 while(1);
### myprog.gdb.py after the break - current stack frame:
{stack=0x7fffffffdc70,code=0x40055b,!special}
### myprog.gdb.py - backtrace:
#0 test_failed() at myprog.c:4
#1 0x000000000040058c in main() at myprog.c:15
### myprog.gdb.py - go to frame that called current frame:
{stack=0x7fffffffdc90,code=0x400567,!special}
status_var is: 33
(gdb)
Tenga en cuenta que al final de este script, sigue siendo el (gdb)
modo interactivo, y puedes usarlo normalmente aquí; si no necesita el aviso interactivo, puede hacer gdb.execute("quit");
como en los scripts anteriores para forzar que gdb
salga al final de la ejecución del script.
También, para un ejemplo de la clase de subclases punto de interrupción en gdb de Python, ver How to print the current line of source at breakpoint in GDB and nothing else?
También puedes ver el tutorial sobre la wiki: https://sourceware.org/gdb/wiki/PythonGdbTutorial –