相关疑难解决方法(0)

如何更改gdb使用的Python解释器?

我正在使用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),但你明白了.

python gdb python-2.7

25
推荐指数
1
解决办法
1万
查看次数

如何在函数返回的GDB中设置断点?

我有一个C++函数,它在不同的地方有很多返回语句.如何在函数实际返回的return语句中设置断点?

什么"破坏"命令没有参数意味着什么?

c++ debugging gdb

22
推荐指数
5
解决办法
2万
查看次数

显示在gdb中执行的每个汇编指令

我目前有一个棘手的错误发生在我无法访问源或符号的地方,即我可以看到崩溃发生的指令及其地址,但就是这样.我想做的是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.

debugging assembly gdb freebsd

10
推荐指数
2
解决办法
5623
查看次数

如何用"x/i $ pc"在GDB中反汇编16位x86引导扇区代码?它被视为32位

例如,使用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位代码?

也可以看看:

x86 assembly gdb qemu disassembly

7
推荐指数
3
解决办法
3732
查看次数

如何让 GDB 继续运行直到程序进入另一个函数?

假设我在 A() 和 A() 调用 B()。我刚刚进入 A() 并且我希望程序运行到我进入 B() 为止。它不必是特定的函数 B()。我只希望我的程序在进入新函数时暂停。有没有办法做到这一点?

c c++ debugging gdb

5
推荐指数
1
解决办法
2194
查看次数

标签 统计

gdb ×5

debugging ×3

assembly ×2

c++ ×2

c ×1

disassembly ×1

freebsd ×1

python ×1

python-2.7 ×1

qemu ×1

x86 ×1