暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[转载] gdb 调试打印完整字符串

digoal 2018-06-21
236

作者

digoal

日期

2018-06-21

标签

PostgreSQL , Linux , gdb


背景

原文

https://blog.csdn.net/shuizhizhiyin/article/details/53227913

正文

在使用gdb调试过程中,经常需要查看变量的值,最常用的方法:

(gdb) print {变量名}

一般情况下,打印并不存在问题。但当一个字符串比较长时,打印出来的内容不完整,内容的最后为"..."

例如:

[cpp] view plain copy (gdb) p (char*)0x23b744a98 $19 = 0x23b744a98 "obbs:S:1.3:{[{1,772830,772830,35513000054164,45514000069401,0,0,15525034,1,7778,-1,0,0,1,1,[{1,7,7,9005,-41600,10402},{1,7,7,9006,-41600,10402},{1,7,7,4002,-1,10402},{1,7,7,4005,17400,10402},{1,7,7,40"...

可以看到print显示的内容最后为"..."表示显示的内容并不完整。

问题:

那如何才能将长字符串显示完整呢?如果字符串比较长,又是依据什么来显示字符串呢?

首先,猜测打印的是一个固定长度的字符串,如果超过了默认的最大长度,那只打印默认最大长度的字符串内容,并在其后显示"..."表示打印内容不完整。

那这里的默认最大长度是多少呢?

通过以下命令可以查看:

[cpp] view plain copy (gdb) show print elements Limit on string chars or array elements to print is 200.

可以看到默认只会打印200个字符。这个可以通过前面的举例验证。

[cpp] view plain copy obbs:S:1.3:{[{1,772830,772830,35513000054164,45514000069401,0,0,15525034,1,7778,-1,0,0,1,1,[{1,7,7,9005,-41600,10402},{1,7,7,9006,-41600,10402},{1,7,7,4002,-1,10402},{1,7,7,4005,17400,10402},{1,7,7,40

刚好是200个字符。

其次,如何更改打印的字符串长度值?

可以通过命令:

[cpp] view plain copy (gdb) set print elements 0 (gdb) show print elements Limit on string chars or array elements to print is unlimited.

使打印的字符串长度不受限制。当然这里你也可以设置一个你需要的合理值。
例如:

[cpp] view plain copy (gdb) set print elements 300 (gdb) show print elements Limit on string chars or array elements to print is 300.

验证:再次打印前面例子中未完全显示的变量:

[cpp] view plain copy (gdb) p (char*)0x23b744a98 $30 = 0x23b744a98 "obbs:S:1.3:{[{1,772830,772830,35513000054164,45514000069401,0,0,15525034,1,7778,-1,0,0,1,1,[{1,7,7,9005,-41600,10402},{1,7,7,9006,-41600,10402},{1,7,7,4002,-1,10402},{1,7,7,4005,17400,10402},{1,7,7,4006,-41600,10402},{1,7,7,4007,0,-1},{1,7,7,4015,17400,10402}]}]}"

OK.这次打印已经能显示整个字符串所有内容。

总结:

使用set print elements [n] 来更改打印字符串的长度。

参考:

[cpp] view plain copy (gdb) help set print elements Set limit on string chars or array elements to print. "set print elements 0" causes there to be no limit.

gdb打印完整字符串内容

在使用gdb进行程序调试时,经常遇到打印字符串内容的情况。但是很遗憾,缺省情况下,当待显示的字符串比较长时,gdb只会显示部分字符串内容,给程序的调试带来不便。

通过如下命令可以实现gdb中打印完整字符串内容:

```
set print element 0

Here is an example. If a program says

int array = (int ) malloc (len * sizeof (int));

you can print the contents of array with
p *array@len
```

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论