【问题标题】:GDB <Address 0xblablabla out of bounds> errorGDB <地址 0xblablabla 越界> 错误
【发布时间】:2014-07-21 13:58:05
【问题描述】:

所以,我正在学习如何用 C 编程,并且我正在(或至少,试图)在 GDB 中获得一些乐趣。

所以我写了这个简单的代码:

#include <stdio.h> 

int main (int argc, char *argv[]){

int i;

int n = atoi(argv[2]); 

for (i=0; i<n ; i++){
    printf("%s \n",i+1,argv[1]); // prints the string provided in 
}                                // the arguments for n times
return 0;
}

我试图使用 GDB 来获取一些关于它的信息。 所以我用它来尝试从内存地址中获取参数,但这就是我得到的:

(gdb) break main
Breakpoint 1 at 0x4005d7: file repeat2.c, line 14.
(gdb) break 17
Breakpoint 2 at 0x40062c: file repeat2.c, line 17.
(gdb) run hello 5
Starting program: /root/Scrivania/Programmazione/repeat2 hello 5
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000

Breakpoint 1, main (argc=3, argv=0x7fffffffe948) at repeat2.c:14
14      int n = atoi(argv[2]);
(gdb) cont
Continuing.
1    ------>     hello 
2    ------>     hello 
3    ------>     hello 
4    ------>     hello 
5    ------>     hello 

Breakpoint 2, main (argc=3, argv=0x7fffffffe948) at repeat2.c:18
18  return 0;
(gdb) x/3xw 0x7fffffffe948     (I try to read what argv contains)
0x7fffffffe948: 0xffffebbc  0x00007fff  0xffffebe3
(gdb) x/s 0xffffebbc           (I try to read one of the argoments in the array)
0xffffebbc:  <Address 0xffffebbc out of bounds>

为什么我不断收到此错误?我是 64 位的,我使用的是 Kali Linux

该程序,如果编译,可以工作,只是我不明白为什么我不能用 GDB 读取这些值。

【问题讨论】:

    标签: c debugging gdb


    【解决方案1】:

    @DrakaSAN 在您的程序中发现了错误。至于你的 gdb 问题:

    x/3xw 打印出 3 个 4 字节字。 argv 是一个 char * 指针数组。 由于您在 64 位系统上,指针为 8 个字节,因此您想使用 g(巨型,8 个字节)或 a(地址)代替 w,这将自动选择正确的大小:

    (gdb) break 7
    Breakpoint 1 at 0x40058c: file repeat2.c, line 7.
    (gdb) run hello 5
    Starting program: /tmp/repeat2 hello 5
    
    Breakpoint 1, main (argc=3, argv=0x7fffffffdfe8) at repeat2.c:7
    7   int n = atoi(argv[2]); 
    (gdb) x/3xg 0x7fffffffdfe8
    0x7fffffffdfe8: 0x00007fffffffe365  0x00007fffffffe372
    0x7fffffffdff8: 0x00007fffffffe378
    (gdb) x/3xa 0x7fffffffdfe8
    0x7fffffffdfe8: 0x7fffffffe365  0x7fffffffe372
    0x7fffffffdff8: 0x7fffffffe378
    (gdb) x/s 0x7fffffffe365
    0x7fffffffe365: "/tmp/repeat2"
    (gdb) x/s 0x7fffffffe372
    0x7fffffffe372: "hello"
    (gdb) x/s 0x7fffffffe378
    0x7fffffffe378: "5"
    

    感谢@adpeace 建议使用a 修饰符。

    【讨论】:

    • 非常感谢,我正在关注一本为 32 位机器编写的书!
    【解决方案2】:

    欢迎来到 SO,感谢您提出的第一个问题 +1。

    printf("%s \n",i+1,argv[1]);
    

    当 printf 需要一个字符串 (%s) 时,您尝试输入一个 int (i)。 我想你想做的是:

    for (i=0; i<n ; i++)
    {
        printf("%s \n", argv[1]);
    }
    

    尽管如此,我很惊讶你的编译器没有为此对你大喊大叫。

    (请注意... Kali Linux 不应该用作开发操作系统,您可能需要使用 Debian 或 Ubuntu...)

    【讨论】:

    • 不,我想打印用户输入的第一个参数(字符串)。该程序应该像这样工作:“ ./program "word" 5 " 它将在屏幕上打印 5 次字符串 "word"。我工作,只是我无法读取 GDB 上的值(我遇到了 GRUB 和 UEFI 问题,而 kali 是我在 cd 上唯一可以工作的操作系统,所以我决定坚持使用它。现在我我只是懒得换回 Ubuntu)
    • @DoubleCat:做你想做的事情的编辑很简单,只需要 argv[1] 而不是 argv[i]。不过,尝试更新 gcc,您的代码不应该编译。
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多