首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

gdb调试字符串互换

2012-09-05 
gdb调试字符串交换C/C++ code1#include stdio.h2char * fan( char *p, int len )3int main()4{5char* p

gdb调试字符串交换

C/C++ code
1       #include <stdio.h>2       char * fan( char *p, int len );3       int main()4       {5         char* p = "123";6         p = fan(p, 3);7         printf( "%s", p );8         return 0;9       }10      char * fan( char *p, int len )(gdb) 11      {                                                                                                                                                                                       12        char temp;                                                                                                                                                                            13        char * n1 = p;                                                                                                                                                                        14        char * n2 = p+len-1;                                                                                                                                                                  15        while( n1 != n2)                                                                                                                                                                      16          {                                                                                                                                                                                   17            temp = *n1;                                                                                                                                                                       18            *n1 = *n2;                                                                                                                                                                        19            *n2 = temp;                                                                                                                                                                       20            n1++;                                                                                                                                                                             (gdb)                                                                                                                                                                                           21            n2--;                                                                                                                                                                             22          }                                                                                                                                                                                   23        return p;                                                                                                                                                                             24      }                                                                                                                                                                                       (gdb) b fan                                                                                                                                                                                     Breakpoint 1 at 0x400544: file shiyan.c, line 13.                                                                                                                                               (gdb) run                                                                                                                                                                                       Starting program: /home/sam/oj/shi                                                                                                                                                                                                                                                                                                                                                              Breakpoint 1, fan (p=0x40068c "123", len=3) at shiyan.c:13                                                                                                                                      13        char * n1 = p;                                                                                                                                                                        (gdb) p *n1                                                                                                                                                                                     $1 = 72 'H'                                                                                                                                                                                     (gdb) n14        char * n2 = p+len-1;(gdb) p *n2Cannot access memory at address 0xf0b2dd(gdb) p len$2 = 3(gdb) p temp$3 = 0 '\000'(gdb) n15        while( n1 != n2)(gdb) n17            temp = *n1;(gdb) p temp$4 = 0 '\000'(gdb) n18            *n1 = *n2;(gdb) nProgram received signal SIGSEGV, Segmentation fault.0x0000000000400574 in fan (p=0x40068c "123", len=3) at shiyan.c:1818            *n1 = *n2;(gdb) p temp$5 = 49 '1'(gdb) nProgram terminated with signal SIGSEGV, Segmentation fault.The program no longer exists.(gdb)  



[解决办法]
char* p = "123";
这里的p指向的空间是只读的,因为不能修改,会出错的
改为:char p[] = "123";
[解决办法]
同意2楼的解决方法,但不同意3楼的解释,即使楼主代码正确,那样去执行gdb,也会显示Cannot access memory。

gdb中执行n,实际是执行一步,同时显示的是下一步将要执行的代码。

char * n2 = p+len-1;这句没执行时,n2的值是任意的,所以才会出现Cannot access memory at address 0xf0b2dd

p=0x40068c,那么p+len-1就是0x40068e,而不应该是0xf0b2dd

真正出错的在这里(显示18行将要执行*n1 = *n2,输入n开始执行,结果发生段错误):

C/C++ code
18            *n1 = *n2;(gdb) nProgram received signal SIGSEGV, Segmentation fault.0x0000000000400574 in fan (p=0x40068c "123", len=3) at shiyan.c:18 

热点排行