exe程序运行出错退出,使用windbg查找出错位置

现象说明:

2011年6月22日,自己编译的exe程序在用户虚拟机上运行起来就出错退出,此现象只在此一台机器上出现,其他机器和开发机器均不出现此问题,此程序代码量很大,此种情况一时无法解决。

最终解决方案:

在同事的帮助下,使用windbg工具,远程调试客户机器,找到原因所在及问题出错位置和函数,出错位置为获取用户硬盘序列号的时候,buf[20]全部为空格,在左右空格并两两颠倒的时候操作内存越界,程序报错退出。

源码如下:

 

void AdjustString(char* str, int len)
{
     char ch;
     int i,j;
     int len1;

    // 若是右对齐的,调整为左对齐 (去掉左边的空格)
     i=0;
     while(i

     // 去掉右边的空格
     j = len - 1;
     while(j>=0 && str[j]==' ')
    {
         str[j] = '/0';
          j--;
     }


     //此处为增加的异常处理 ,如果str全部为空格,则返回
     if(i==len||j==-1)
     {
         OutputDebugString ("AdjustString() str==NULL");
         return;
     }

 

      len=j;

     ::memmove(str, &str[i], len-i+1);     //出错位置,在全部空的情况下,传入的len=20,此处 i==20,j==-1,
     str[len-i+1]='/0';
     len1=len-i+1;
  
     // 两两颠倒
     for(i=0;i     { 
         ch = str[i];
         str[i] = str[i+1];
         str[i+1] = ch;
      }
}

 

问题查找的过程:

工程人员在现场,程序出错后,利用 windbg 生成 dump,
然后发给开发人员,开发人员通过 windbg 打开后根据调用堆栈跟踪到的。
 

总结:

深入学习windbg的调试方法和技术,灵活的使用此工具。
 

你可能感兴趣的:(解决问题总结,exe,工具,虚拟机,null)