【发布时间】:2015-11-13 18:59:34
【问题描述】:
我现在只是想学习使用 gdb。我正在使用的程序运行良好;我不想调试它或任何东西;我只是在测试 gdb 的功能。这是源代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main( int argc, char **argv ){
int wordcount = 0;
int len = strlen( argv[1] );
for( int i = 0; i < len; i++ ){
if( isspace( argv[1][i] ) && !isspace( argv[1][i-1] ) )
wordcount++;
}
if( !isspace( argv[1][len-1] ) ) wordcount++;
if( wordcount == 0 && len > 0 ) // if all characters were non-whitespace,
wordcount = 1; // then there was exactly one word
printf( "%d\n", wordcount );
return 0;
}
我启动 gdb 并运行程序,在第 7 行和第 9 行设置断点。我使用了 backtrace 和 step 命令,但我根本不理解它们的输出。当我输入“backtrace full”时,gdb 给了我这个:
#0 _start () at ../sysdeps/i386/elf/start.S:65
No locals.
这到底是什么意思?什么是_start?什么是../sysdeps/i386/elf/start.S:65?当我明确声明 wordcount 和 len 时,怎么可能没有本地人?我试过谷歌,但我在 gdb 上找到的每个教程都显示它产生的输出与我得到的完全不同(更详细)。当我用谷歌搜索得到的字符串时,我会得到一堆关于 ARM 架构的结果。
【问题讨论】:
-
确保使用调试符号进行编译——在 GCC 上,这是每个编译命令的
-g标志。 -
或者更好的是,使用
-ggdb。 -
错误出现在for循环的开头。如果
i是0,那么i-1会是什么?该索引超出范围。 -
好的,-g 选项似乎提供了更明确的输出。还没有尝试过-ggdb。是的,当你指出它时,我注意到程序中的错误,ott。这应该很容易解决。不过我只写了测试gdb的程序,所以错误并不重要。
-
@ott:是的,但 OP 并没有询问代码的正确性。这是一个微妙的错误;只有当命令行参数的第一个字符是空格时它才会跳闸,并且你必须努力做到这一点。它可以被故意触发;不可能是偶然的。可能是一个安全问题,具体取决于用例。