免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4360 | 回复: 11
打印 上一主题 下一主题

[C] [急教]unix/linux下有什么工具能跟踪一段内存的读写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-11 16:56 |只看该作者 |倒序浏览
10可用积分
1.问题
我最近碰到这样一个问题,一个程序(非常非常大的工程)中有一个字符串,例如叫做s,然后在程序的主代码里面:
char s[]="abc";
function();//不应该修改字符串s,但是fucntion函数中可能有内存泄漏和覆盖。
我发现在function()调用完成后,ss的内容是xyz

2.需求:
我想知道在function()被调用的过程中,都哪些地方修改/覆盖了s所在的内存,最好能显示出函数调用的堆栈(function可能调用了很多其他函数).
或者: 可不可以锁定一段内存,当有代码要覆盖它的时候记录下调用的函数信息并反馈给我

3.请问: 有这样的工具吗? 谢谢。

最佳答案

查看完整内容

用valgrind跑跑看看吧。。

论坛徽章:
0
2 [报告]
发表于 2008-09-11 16:56 |只看该作者
用valgrind跑跑看看吧。。

论坛徽章:
0
3 [报告]
发表于 2008-09-11 16:59 |只看该作者
很简单吗:

将char s[] = "abc"; 变成
char *s = "abc";

然后运行程序, 会出问题的, 加printf, 几次就找到出问题的地方了.

论坛徽章:
0
4 [报告]
发表于 2008-09-11 17:02 |只看该作者
原帖由 思一克 于 2008-9-11 16:59 发表
很简单吗:

将char s[] = "abc"; 变成
char *s = "abc";

然后运行程序, 会出问题的, 加printf, 几次就找到出问题的地方了.

有内存泄漏的话,这样应该就不会出现楼主的现象了吧?

论坛徽章:
0
5 [报告]
发表于 2008-09-11 17:02 |只看该作者
以上方法在function中无意修改s时候有效.

在某些时候无效. 这时候, 你可以设置s[]的地址"只读", 运行等待错误发生. 道理同前.

论坛徽章:
0
6 [报告]
发表于 2008-09-11 17:32 |只看该作者
gdb中的watch命令用一下

论坛徽章:
0
7 [报告]
发表于 2008-09-11 17:37 |只看该作者
谢谢楼上的两位,还想知道:

-----------------------------------------
很简单吗:

将char s[] = "abc"; 变成
char *s = "abc";

然后运行程序, 会出问题的, 加printf, 几次就找到出问题的地方了.
------------------------------------------
1. 为什么改为char*就可以了呢? char*和char s[]定义的字符串,难道不都是在程序的数据段里面的常量,它们的区别是什么?
2. 我在C程序中怎么把s设置成只读的呢? 似乎没有java那种readonly的关键字啊!

请继续指教啊!

论坛徽章:
0
8 [报告]
发表于 2008-09-11 17:44 |只看该作者
原帖由 jeanlove 于 2008-9-11 17:37 发表
谢谢楼上的两位,还想知道:

-----------------------------------------
很简单吗:

将char s[] = "abc"; 变成
char *s = "abc";

然后运行程序, 会出问题的, 加printf, 几次就找到出问题的地方了.
- ...

const 就相当于只读了

论坛徽章:
0
9 [报告]
发表于 2008-09-11 17:45 |只看该作者

回复 #7 jeanlove 的帖子

第一个问题:char *s="abc"中指针变量是保存在堆栈里面的,而字符串"abc"是保存在常量区里.
对于char s[]="abc" 这个字符串是保存在堆栈里面的,从函数返回后,堆栈中的内容就没有了.
第二个问题:可以加关键字 const.
不知道对不对  ,说出来供大家参考讨论.

[ 本帖最后由 szjrabbit 于 2008-9-11 17:46 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-09-11 17:54 |只看该作者
设置const是编译时的只读,不是运行时的只读保护啊,呵呵,
决定学一下valgrind.

谢谢楼上各位高手的指点! 确实很难决定分送给谁! 但是还是要送出的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP