在调试期间,我的程序跳转到最近的 while 语句而不中断或继续 [C++]
During debugging my program jumps to nearest while statement without break or continue [C++]
当 运行 我在 gdb 下的 C++/Qt5 程序时,我遇到了似乎不可能的事情:
while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){
if(nullptr!=c){
// POINT-A
qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
const int left=bytesAvailable-bytesSpent;
totalAvailable-=bytesSpent;
if(left>=0){
if(left>0){
ds->skipRawData(left);
totalAvailable-=left;
}
else{
// POINT-B
qDebug()<<rct<<"LOLBOB";
}
}
else{
qWarning()<<"BAR";
return;
}
}
else{
qWarning()<<"FOO";
return;
}
}
简而言之,当我从 //POINT-A
步进到 //POINT-B
时,一切都符合预期,但是一旦我步过 //POINT-B
,调试器就会跳转到程序的第一行(while
语句)。但是代码中没有 break
或 continue
或其他改变流程的语句。这怎么可能?
我已经尝试从头开始重建我的代码以消除虚假链接或类似问题,但错误仍然可以重现。
欢迎任何意见。
在 POINT-B,你在 else 里面,它在 if 里面,它在 if 里面。完成else之后,整棵树就没什么可做的了。
你希望指针跳转到哪里??
从技术上讲,它将转到 POINT-B 后两行的右括号,然后转到 POINT-B 后三行的右括号,然后转到 POINT-B 后八行的右括号,然后转到右括号括号在最后。所有这些都不做任何事情,所以他们被跳过了。
拿起纸笔,画出这段代码的逻辑流程。
您会惊奇地发现,在标记为 "POINT B" 的语句之后,唯一可能执行的语句是 while 循环开头的条件。执行完 "POINT B" 语句后,循环体中没有更多的语句要执行,因此执行回到 while
条件,进行下一次迭代。
基本上循环只是重新迭代。我相信它正在按预期运行。从 A 点开始,控制是这样的:
If 1 (Point-A) -> If 2 -> If 3对应的Else -> 回到If 2的结尾 -> 回到If 1的结尾 - > 回到 while 循环的结尾。
随着循环结束,执行检查循环条件,(如果满足)重新迭代,最终您再次到达点 A。
while()
{
if() // If no.1
{
// Point-A *****************************
if() // If no.2
{
if() // If no.3
{
}
else()
{
// Point-B *****************
}
}
else
{
}
}
else
{
}
}
为了提高调试和可读性,不要继续嵌套 if 块或循环 - 很难跟踪执行。
看看你是不是这样写的:
while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){
if(nullptr==c){
qWarning()<<"FOO";
return;
}
// POINT-A
qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
const int left=bytesAvailable-bytesSpent;
totalAvailable-=bytesSpent;
if(left<0){
qWarning()<<"BAR";
return;
}
if(left>0){
ds->skipRawData(left);
totalAvailable-=left;
}
else{
// POINT-B
qDebug()<<rct<<"LOLBOB";
}
}
当 运行 我在 gdb 下的 C++/Qt5 程序时,我遇到了似乎不可能的事情:
while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){
if(nullptr!=c){
// POINT-A
qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
const int left=bytesAvailable-bytesSpent;
totalAvailable-=bytesSpent;
if(left>=0){
if(left>0){
ds->skipRawData(left);
totalAvailable-=left;
}
else{
// POINT-B
qDebug()<<rct<<"LOLBOB";
}
}
else{
qWarning()<<"BAR";
return;
}
}
else{
qWarning()<<"FOO";
return;
}
}
简而言之,当我从 //POINT-A
步进到 //POINT-B
时,一切都符合预期,但是一旦我步过 //POINT-B
,调试器就会跳转到程序的第一行(while
语句)。但是代码中没有 break
或 continue
或其他改变流程的语句。这怎么可能?
我已经尝试从头开始重建我的代码以消除虚假链接或类似问题,但错误仍然可以重现。
欢迎任何意见。
在 POINT-B,你在 else 里面,它在 if 里面,它在 if 里面。完成else之后,整棵树就没什么可做的了。
你希望指针跳转到哪里??
从技术上讲,它将转到 POINT-B 后两行的右括号,然后转到 POINT-B 后三行的右括号,然后转到 POINT-B 后八行的右括号,然后转到右括号括号在最后。所有这些都不做任何事情,所以他们被跳过了。
拿起纸笔,画出这段代码的逻辑流程。
您会惊奇地发现,在标记为 "POINT B" 的语句之后,唯一可能执行的语句是 while 循环开头的条件。执行完 "POINT B" 语句后,循环体中没有更多的语句要执行,因此执行回到 while
条件,进行下一次迭代。
基本上循环只是重新迭代。我相信它正在按预期运行。从 A 点开始,控制是这样的:
If 1 (Point-A) -> If 2 -> If 3对应的Else -> 回到If 2的结尾 -> 回到If 1的结尾 - > 回到 while 循环的结尾。
随着循环结束,执行检查循环条件,(如果满足)重新迭代,最终您再次到达点 A。
while()
{
if() // If no.1
{
// Point-A *****************************
if() // If no.2
{
if() // If no.3
{
}
else()
{
// Point-B *****************
}
}
else
{
}
}
else
{
}
}
为了提高调试和可读性,不要继续嵌套 if 块或循环 - 很难跟踪执行。
看看你是不是这样写的:
while(totalAvailable > (sizeof(quint32)+sizeof(quint16))){
if(nullptr==c){
qWarning()<<"FOO";
return;
}
// POINT-A
qDebug()<<rct<<"Courier message with ID "<<octomy_message_type_int<<" was received with name "<<c->getName()<<" and "<<bytesAvailable<<" bytes available";
const quint16 bytesSpent=c->dataReceived(*ds, bytesAvailable);
const int left=bytesAvailable-bytesSpent;
totalAvailable-=bytesSpent;
if(left<0){
qWarning()<<"BAR";
return;
}
if(left>0){
ds->skipRawData(left);
totalAvailable-=left;
}
else{
// POINT-B
qDebug()<<rct<<"LOLBOB";
}
}