关于VS 调试过程中,设置变量断点的求教

zacwang15 2017-10-22 02:31:54
本人是C++新手,最近在使用GDAL遥感库处理数据。

最近在处理过程中,总是报错,问题出在gdal库中一个类的成员变量上面。如下代码所示
if( nYBlockOff < 0 || nYBlockOff >= nBlocksPerColumn )
{
ReportError( CE_Failure, CPLE_IllegalArg,
"Illegal nYBlockOff value (%d) in "
"GDALRasterBand::WriteBlock()\n",
nYBlockOff );


nBlocksPerColumn变量是出现问题的原因,这个值出错,所以才会报错。

这个成员变量是在类中自动赋值的,而我不清楚具体是在哪一步调用的这个变量,并为其赋值的。

代码实在太长了,一步步F11 也不太现实。

我想能不能设置一个变量断点,当遇到nBlocksPerColumn变量初始化和赋值的时候,就能让程序自动转跳过去并停下,

这样我就能找到这个变量是怎么赋值的,错误出在哪里。

请问各位老师,vs调试里面如何做到,非常感谢。





...全文
526 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-23
  • 打赏
  • 举报
回复
仅供参考:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
zacwang15 2017-10-23
  • 打赏
  • 举报
回复
引用 10 楼 yeyingting30 的回复:
开源可以找, 看图, 我刚试了

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

class aytest
{
public:
	int nBlocksPerColumn;
	int nRasterXSize;
	aytest()
	{
		nBlocksPerColumn = 0;
	}
	~aytest()
	{

	}
};

int main() {

	aytest mytest;
	aytest* p = &mytest;

	p->nRasterXSize = 1;

	p->nRasterXSize = 2;
	
	p->nRasterXSize = 3;	

	system("pause");

}
非常感谢您,我再试试
zacwang15 2017-10-23
  • 打赏
  • 举报
回复
[quote=引用 2 楼 paschen 的回复:]
->->,然后输入你要监视的变量的内存地址,这样在指定的地址处的变量被修改时程序被断下[/quote]

版主您好,
首先请问 ->-> 是什么意思,怎么用?

其次,只知道变量的名字,怎么知道其地址是什么,如下图所示,监视的时候没有显示其地址啊,
是用& 加上变量名字显示其地址吗,然后在监视里添加其地址?
麻烦您告知下,非常感谢。




yeyingting30 2017-10-23
  • 打赏
  • 举报
回复
记得用条件 更新时
yeyingting30 2017-10-23
  • 打赏
  • 举报
回复
开源可以找, 看图, 我刚试了

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

class aytest
{
public:
int nBlocksPerColumn;
int nRasterXSize;
aytest()
{
nBlocksPerColumn = 0;
}
~aytest()
{

}
};

int main() {

aytest mytest;
aytest* p = &mytest;

p->nRasterXSize = 1;

p->nRasterXSize = 2;

p->nRasterXSize = 3;

system("pause");

}


zacwang15 2017-10-23
  • 打赏
  • 举报
回复
引用 8楼yeyingting30 的回复:
你使用的类是别人写的封装好了的吧,而且你还没有它的源代码吧 如果是的那你是无法在普通状态下对该类内部代码进行断点调试的,要做到你说的那样对别人封装的类的代码进行断点调试我所知道就方式就是破解了,(一般情况别人封装的类不会有大问题, 问题一般出在使用人对该类对象没初始化或者对象指针使用 释放上) 破解能做到,但涉及的东西太多了(简单说是对Release版本程序通过破解工具对程序的机器代码(工具会转换成汇编代码)进行调试,你可以把程序代码的每一部分都搞清,如果程序加壳加密了,你还要解壳,解密). 你的情况我建议你从那个类的对象实例着手.先找出每个实例的使用地方,用分段排除法(不要把一大堆代码一下全部运行调式,把代码分割成多个部分,从前往后,后面的先注释掉,先测试前面的,没问题再加测后面的一部分,直到找到问题). 要注意 生成类的对象时尽量初始化,有很多时候对象不初始化就引用会有问题的, 另外是对象指针使用你也要注意生成和释放
谢谢您,我现在用的类应该是开源的,但是我水平太菜,所以看不太懂源代码。 总之很感谢您的解答
yeyingting30 2017-10-23
  • 打赏
  • 举报
回复
你使用的类是别人写的封装好了的吧,而且你还没有它的源代码吧 如果是的那你是无法在普通状态下对该类内部代码进行断点调试的,要做到你说的那样对别人封装的类的代码进行断点调试我所知道就方式就是破解了,(一般情况别人封装的类不会有大问题, 问题一般出在使用人对该类对象没初始化或者对象指针使用 释放上) 破解能做到,但涉及的东西太多了(简单说是对Release版本程序通过破解工具对程序的机器代码(工具会转换成汇编代码)进行调试,你可以把程序代码的每一部分都搞清,如果程序加壳加密了,你还要解壳,解密). 你的情况我建议你从那个类的对象实例着手.先找出每个实例的使用地方,用分段排除法(不要把一大堆代码一下全部运行调式,把代码分割成多个部分,从前往后,后面的先注释掉,先测试前面的,没问题再加测后面的一部分,直到找到问题). 要注意 生成类的对象时尽量初始化,有很多时候对象不初始化就引用会有问题的, 另外是对象指针使用你也要注意生成和释放
zacwang15 2017-10-23
  • 打赏
  • 举报
回复
引用 6 楼 levi888666 的回复:
[quote=引用 5 楼 yeyingting30 的回复:]

#include <iostream>
#include <string>
using namespace std;

int main() {
	int *p;
	int nBlocksPerColumn;
	p = &nBlocksPerColumn;

	nBlocksPerColumn = 1;

	nBlocksPerColumn = 2;

	nBlocksPerColumn = 3;	

	system("pause");

}
在p = &nBlocksPerColumn;处先断下 按F5开始调试,断停后再通过菜单:调式->新建断点->数据断点 建立条件断点(更改时),如下图: 现在再按F5运行,只要nBlocksPerColumn;改变就会断下
您好,我想监视nBlocksPerColumn变量,实际是类中的成员变量,按照您教的方法,为什么会出现如下错误? [/quote] 这里是用nRasterXSize为例的,实际和nBlocksPerColumn是一样的
zacwang15 2017-10-23
  • 打赏
  • 举报
回复
引用 5 楼 yeyingting30 的回复:

#include <iostream>
#include <string>
using namespace std;

int main() {
int *p;
int nBlocksPerColumn;
p = &nBlocksPerColumn;

nBlocksPerColumn = 1;

nBlocksPerColumn = 2;

nBlocksPerColumn = 3;

system("pause");

}


在p = &nBlocksPerColumn;处先断下
按F5开始调试,断停后再通过菜单:调式->新建断点->数据断点 建立条件断点(更改时),如下图:


现在再按F5运行,只要nBlocksPerColumn;改变就会断下


您好,我想监视nBlocksPerColumn变量,实际是类中的成员变量,按照您教的方法,为什么会出现如下错误?
yeyingting30 2017-10-23
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;

int main() {
int *p;
int nBlocksPerColumn;
p = &nBlocksPerColumn;

nBlocksPerColumn = 1;

nBlocksPerColumn = 2;

nBlocksPerColumn = 3;

system("pause");

}


在p = &nBlocksPerColumn;处先断下
按F5开始调试,断停后再通过菜单:调式->新建断点->数据断点 建立条件断点(更改时),如下图:


现在再按F5运行,只要nBlocksPerColumn;改变就会断下
paschen 版主 2017-10-22
  • 打赏
  • 举报
回复
->->,然后输入你要监视的变量的内存地址,这样在指定的地址处的变量被修改时程序被断下
ID870177103 2017-10-22
  • 打赏
  • 举报
回复
不现实,你至少要知道哪些函数写了该变量 因为VS的断点最多只能做到中断并检查变量是否变化 实际上断点只是代码注入,你需要自己确定要在哪中断

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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