Po prostu chciałem zauważyć coś, co jest mylące, gdy wrócę do tego tematu (Uwaga, obecnie jestem na Ubuntu 14.04, GNU gdb (Ubuntu 7.7.1-0ubuntu5 ~ 14.04.3) 7.7.1):
Po pierwsze, istnieją wzmianki o to czy jest "możliwe, aby wywołać gdb
jako tłumacza":
... sens, należałoby napisać skrypt plik tekstowy z linią shebang #!/usr/bin/gbd -P
lub #!/usr/bin/gbd --python
, a następnie napisać kod Python w nim, a następnie uczynić go wykonywalnym chmod +x pygdbscript
, a następnie uruchomić ./pygdbscript
; ... ale jak w tym poście:
..., mam gdb: unrecognized option '--python'
jeśli próbuję coś podobnego. Podobno ta opcja jest/była funkcją w jakiejś gałęzi "łuczników" gdb
?!
Tak, aby uruchomić skrypt Pythona w gdb
istnieją właściwie dwa sposoby:
- Nazwa pliku skryptu z rozszerzeniem
.py
; powiedzieć test.py
tutaj:
def Something():
print("hello from python")
Something()
gdb.execute("quit");
Uwaga, w tym przypadku, po prostu napisać zwykły kod Pythona; i nie trzeba do import gdb
, aby uzyskać dostęp do obiektu gdb
. Ten można uruchomić z jednym z:
gdb -x test.py
gdb -x=test.py
gdb --command test.py
gdb --command=test.py
gdb -command test.py
gdb -command=test.py
... co wydaje się być równoważne, jako wynik dla każdego z nich jest taki sam wydruk przed gdb
jest instruowany, aby wyjść przez skrypt:
$ 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
UWAGA, że w tym przypadku, jak również nazwy test.gdb.py
będą interpretowane jako czystych skryptów Pythona, gdyż wtedy kończy się .py
.
- Nazwa skryptu cokolwiek innego - tak długo, jak to robi nie
.py
koniec z rozszerzeniem; powiedzieć test.pygdb
tutaj:
python
def Something():
print("hello from python")
Something()
gdb.execute("quit");
end
W tym przypadku gdb
interpretuje skrypt jako bycie gdb
skrypt, czyli z gdb
poleceń - a to oznacza, że bez względu na kod Pythona może chcesz napisać tutaj, koniecznością zapakowane w "python
" jako linię startową i "end
" na końcu kodu Pythona. Ponownie, to można nazwać któregokolwiek z tych połączeń równorzędnych:
gdb -x test.pygdb
gdb -x=test.pygdb
gdb --command test.pygdb
gdb --command=test.pygdb
gdb -command test.pygdb
gdb -command=test.pygdb
... i to wyjście jest taki sam, jak w poprzednim przypadku (ponieważ jest to ten sam skrypt Pythona bieg):
$ gdb -x test.pygdb
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
...
hello from python
w odpowiedzi na OP: jeśli kod C w pO znajduje się /tmp/myprog.c
- z dodanym int start_test() { return rand() % 50; }
na górze, w przeciwnym razie nie będzie opracować -, i opracowano zz gcc -g myprog.c -o myprog.exe
do /tmp/myprog.exe
; następnie można użyć myprog.gdb.py
skrypt tak:
# 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)
... następnie uruchomić ten skrypt:
$ 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)
Zauważ, że na końcu tej skrypcie (gdb)
interaktywny wiersz pozostaje i możesz go normalnie używać tutaj; jeśli nie potrzebujesz interaktywnego pytania, możesz wykonać, tak jak w powyższych skryptach, aby wymusić na końcu wykonywania skryptu gdb
.
Również na przykładzie klasy subclassing przerwania w gdb Pythonie zobaczyć How to print the current line of source at breakpoint in GDB and nothing else?
Sprawdź również poradnik na wiki: https://sourceware.org/gdb/wiki/PythonGdbTutorial –