vc中这种情况怎么调试。。。
如下变量:
char *g_str = NULL;
g_str = (char*)malloc(100);
strcpy(g_str,"hello world");
当程序运行的时候,发现字符串g_str的内容被莫名其妙地改变了,并且从代码看没有任何其地方
对字符串进行了操作。根据我以往的经验,这种情况往往是由于别的程序段进行了越界操作,从而
引起了g_str指向的内存被改写了。
如果程序很小,仔细地看看代码往往可以解决问题,但如果代码量非常大,找起来就非常
费力了。
我是这样尝试解决问题的:
在vc中设置数据断点,步骤是这样的:
点菜单edit-->breakpoints-->data选项卡下
enter the expression to be evaluated下面的框中输入 g_str[5]
注:监视数组元素g_str[5]的变化,这样如果别的程序段改写了这段内存块,调试的时候就应该在
改变的地方停下来,就能够找到出问题的代码了。
但是当调试运行程序时,vc提示这个断点设置无效,然后就停在了程序的入口点。
=====================
另外如果这样定义g_str:
char g_str[100];
strcpy(g_str, "hello world");
接下来按上面的步骤设置断点,可以入我所料,能够找到越界的代码段,从而解决问题。
但这只是权宜之计,如果整个程序大环境不允许用char g_str[100],只能用前面指针的
方式,应该怎么查处有问题的代码呢??
大虾们帮忙看看,鞠躬ing...
问题点数:20、回复次数:5Top
1 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2005-02-01 17:54:09 得分 4
char *g_str = NULL;
g_str = (char*)malloc(100);
strcpy(g_str,"hello world");
把他该成const char g_str[] = "hello world";
让编译器给你找发生改动的地方。Top
2 楼boyb()回复于 2005-02-01 20:25:48 得分 0
to darkstar:
这个例子是我从原来的工程中抽出来的,因为原来工程里相关代码并不是我举的例子这样,所以要是原样搬到这个贴子来更加说明不了问题。那个工程非常大,涉及到相关的数据结构非常多,如果按照你建议这种方法改起来基本是行不通的。谢谢你
有没有更好的方法可以直接监视动态分配的内存内容的变化呢???
Top
3 楼fancyf(凡瑞)回复于 2005-02-01 20:39:14 得分 4
VC可以将断点触发的条件设置为“已更改”,就是当某变量值更改以后这个断点才起作用,方法是右键单击断点,选“属性”,再选“条件”。
这个办法可能能解决你的问题。
不知道具体位置,就多设几个断点,逐步缩小范围Top
4 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-02-02 08:22:46 得分 12
如果是全局变量,把变量修改成单实例的类成员。在造成崩溃的语句之前设置断点,用VC的监视功能观察类对象的数据是否合法。查找对第一个不合法成员的引用。
Top
5 楼boyb()回复于 2005-02-02 10:08:19 得分 0
to jiangsheng:
多谢指点!
你说的我不大能理解,能说得详细点吗?关键是不知道哪条语句造成了崩溃,程序的表现不是崩溃,而是不正常了。
另外,这个工程都是用c写的,没有类。Top




