我正在使用ubuntu 14.04,其中python3是一个默认的系统包.
我想用gdb调试Python2.7程序,但我似乎遇到了这个问题:
当我在gdb中时,使用该py命令将我放入解释器中,所以我在解释器中运行这些命令:
首先,我检查解释器版本:
(gdb) py
>import sys
>print(sys.version)
>end
3.4.0 (default, Apr 11 2014, 13:08:40)
[GCC 4.8.2]
Run Code Online (Sandbox Code Playgroud)
然后我检查正在使用的解释器可执行文件
(gdb) py
>import sys
>print(sys.executable)
>end
/usr/bin/python
(gdb)
Run Code Online (Sandbox Code Playgroud)
然后在bash中,我检查解释器:
12:34]hostname ~ $ls -l /usr/bin/python
lrwxrwxrwx 1 root root 9 Dec 21 2013 /usr/bin/python -> python2.7
Run Code Online (Sandbox Code Playgroud)
因此虽然gdb说它使用我的2.7解释器,但实际上它正在使用另一个.我需要一个2.7解释器才能将它与ubuntu包'python2.7-dbg'提供的python特定扩展一起使用,因为据我所知,目前还没有这样的python 3.4包,即使有,我想调试的程序运行python 2.7
我的问题是我如何使用我想要的翻译?
[编辑] 不要卸载python3顺便说一句.我是在ubuntu 14.04上做的,它破坏了我的系统.无法再设法让它恢复正常.我目前正在使用它没有窗口管理器(它很酷和1337),但你明白了.
我有一个C++函数,它在不同的地方有很多返回语句.如何在函数实际返回的return语句中设置断点?
什么"破坏"命令没有参数意味着什么?
我目前有一个棘手的错误发生在我无法访问源或符号的地方,即我可以看到崩溃发生的指令及其地址,但就是这样.我想做的是gdb运行而不需要交互并显示每条指令,但我还没有找到办法.
我希望实现的是这样的:
(gdb) /* some command */
0x2818a7c0: push %ebp
0x2818a7c1: mov %esp,%ebp
0x2818a7c3: push %ebx
0x2818a7c4: sub $0x4,%esp
...
0x28563622: mov %esi,0x0(%eax)
Program received signal SIGSEGV, Segmentation fault.
Run Code Online (Sandbox Code Playgroud)
我一直在做的是为程序计数器设置一个显示器,如下所示:
(gdb) display/i $pc
Run Code Online (Sandbox Code Playgroud)
然后运行代码stepi:
(gdb) stepi
1: x/i $pc 0x2818a7c0: push %ebp
Run Code Online (Sandbox Code Playgroud)
然而,崩溃是数百或数千条指令,我想要一种方法来看每一个(一起,如果可取的话),而不必多次点击"输入".另外,如果我是手动完成的,我会(gdb)在每条指令之间看到一个提示,这是不太理想的.
我简要介绍的一条路线是脚本,但我唯一的想法是设置main(),显示和另一个中断(下一条指令),然后继续,但后来我不能commands在一个commands块内使用,所以它不会像我想象的那样工作.
如果它很重要,我正在使用FreeBSD.
例如,使用BIOS打印a到屏幕的引导扇区main.asm:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
然后:
nasm -o main.img main.asm
qemu-system-i386 -hda main.img -S -s &
gdb -ex 'target remote localhost:1234' \
-ex 'break *0x7c00' \
-ex 'continue' \
-ex 'x/3i $pc'
Run Code Online (Sandbox Code Playgroud)
我明白了:
0x7c00: cli
0x7c01: mov $0x10cd0e61,%eax
0x7c06: hlt
Run Code Online (Sandbox Code Playgroud)
所以看起来它mov ax, 0x0E61被解释为32位mov %eax并且将下一条指令int 0x10作为数据.
我怎么能告诉GDB这是16位代码?
也可以看看:
objdump" https://www.sourceware.org/ml/gdb/2007-03/msg00308.html,如下所示:如何反汇编原始x86代码?也许这是在实施的同时实施的?假设我在 A() 和 A() 调用 B()。我刚刚进入 A() 并且我希望程序运行到我进入 B() 为止。它不必是特定的函数 B()。我只希望我的程序在进入新函数时暂停。有没有办法做到这一点?