程序遇到一个最诡异的BUG了...

fdl19881 2013-03-27 01:23:13
看看GDB的调试:
(gdb) l utils.cpp:83
78 }
79
80
81 void dumpBuffer(const char *in, size_t len)
82 {
83 for(int i = 0 ; i < (int)len; i ++) {
84 printf("%2x \n",in[i]);
85 }
86 printf("\n");
87 }
(gdb) jump 82
Continuing at 0x80584f6.

Breakpoint 1, dumpBuffer (in=0xb7c10d0c "\002", len=32) at utils.cpp:83
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb) p/x *in@len
$10 = {0x2, 0x0, 0x20, 0x6, 0x8, 0x0, 0x49, 0x2e, 0x93, 0x1f, 0xa1, 0x4e,
0x60, 0x0, 0x30, 0x46, 0x36, 0x42, 0x30, 0x34, 0x7b, 0x32, 0x38, 0x30, 0x33,
0x41, 0x38, 0x42, 0x43, 0x45, 0x0, 0x3}

(gdb) n
84 printf("%2x \n",in[i]);
(gdb) n
2
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb) n
84 printf("%2x \n",in[i]);
(gdb) n
0
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
20
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
6
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
8
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
0
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
49
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
2e
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb)
84 printf("%2x \n",in[i]);
(gdb)
ffffff93
83 for(int i = 0 ; i < (int)len; i ++) {
(gdb) p i
$11 = 8
(gdb) p /x in[i]
$12 = 0x93

(gdb) p *stdout
$13 = {_flags = -72537468,
_IO_read_ptr = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n", _IO_read_end = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n",
_IO_read_base = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n",
_IO_write_base = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n", _IO_write_ptr = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n",
_IO_write_end = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n", _IO_buf_base = 0xb7fda000 "ffffff93 \nerverResponse:\nferUsed = 0,len = 6\n",
_IO_buf_end = 0xb7fda400 "", _IO_save_base = 0x0, _IO_backup_base = 0x0,
_IO_save_end = 0x0, _markers = 0x0, _chain = 0xb7e19ac0 <_IO_2_1_stdin_>,
_fileno = 1, _flags2 = 0, _old_offset = -1, _cur_column = 0,
_vtable_offset = 0 '\000', _shortbuf = "",
_lock = 0xb7e1a8b8 <_IO_stdfile_1_lock>, _offset = -1, _codecvt = 0x0,
_wide_data = 0xb7e19c20 <_IO_wide_data_1>, _freeres_list = 0x0,
_freeres_buf = 0x0, _freeres_size = 0, _mode = -1,
_unused2 = '\000' <repeats 39 times>}
(gdb)

数据明明是正确的,但printf输出时总是在中间会多输出一些ffffff,就像上面的红色字样的..蛋疼..

估计是哪个地方写数据越界了....慢慢找找BUG了...哎哎,
...全文
178 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdl19881 2013-03-27
  • 打赏
  • 举报
回复
引用 2 楼 mymtom 的回复:
原因 C89 4.9.6.1 The fprintf function Synopsis #include <stdio.h> int fprintf(FILE *stream, const char *format, ...); ... An optional h specifying that a following d, i, o, u, x……
哦,对,,, 哎,调程序时,发现发送数据中间总是多了一串0,,所以想打印看看,也就没想到整型提升,负的就成很大的了. 结帖
mymtom 2013-03-27
  • 打赏
  • 举报
回复
3.2.1.1 Characters and integers A char, a short int, or an int bit-field, or their signed or unsigned varieties, or an object that has enumeration type, may be used in an expression wherever an int or unsigned int may be used. If an int can represent all values of the original type, the value is converted to an int; otherwise it is converted to an unsigned int. These are called the integral promotions. The integral promotions preserve value including sign. As discussed earlier, whether a “plain” char is treated as signed is implementation-defined.
mymtom 2013-03-27
  • 打赏
  • 举报
回复
原因 C89 4.9.6.1 The fprintf function Synopsis #include <stdio.h> int fprintf(FILE *stream, const char *format, ...); ... An optional h specifying that a following d, i, o, u, x, or X conversion specifier applies to a short int or unsigned short int argument (the argument will have been promoted according to the integral promotions, and its value shall be converted to short int or unsigned short int before printing); ...
mymtom 2013-03-27
  • 打赏
  • 举报
回复
printf("%2x \n",in[i]); 改为 printf("%2x \n",(unsigned char)in[i]);

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧