小编Kni*_*ard的帖子

如何调试ActiveX控件(OCX)或使其记录错误?

我目前正在使用一个相当古老的Borland C++应用程序,它使用ActiveX组件绘制一些图形.在应用程序中使用ActiveX comp的多个窗口.可以随时打开 - 这些可以显示相同的图形(不同的缩放系数等),也可以显示不同的图形.

该应用程序用于定位,ActiveX正在绘制并显示不同单元的位置.

每秒大约10次Borland应用程序获得一个新位置,并找出哪些形式(及其ActiveX)需要知道更新的位置以便绘制它.这已经进行了很长时间,但我不得不在ActiveX中为新版本的产品做一些更改.

大约一年前,我不得不对组件进行一些小的更改,并且我发现应用程序可能以某种状态结束,导致组件中出现"索引越界"错误.结果不是显示错误或程序终止,而是应用程序开始使用大量内存 - 并且继续快速上升.在某些时候它停止了,有错误的组件只是停止显示任何东西(停止绘制自己).

现在我已经做了最近的改变,我遇到了同样的问题,其中一个组件似乎得到一个错误,没有得到显示,而是它没有重绘自己,并且内存使用是天高的.在一些PC上,似乎抛出了访问冲突 - 这就是说错误发生在OCX中,但是在我开发的PC上,我无法以任何方式获得此访问冲突.

此外,我无法准确追踪错误发生的时间 - 即导致错误的原因.我可以连续10次运行相同的设置15分钟,有时会发生内存使用上升和组件错误,有时没有任何反应,它会在整个持续时间内运行.

由于它是OCX,因此使用regsvr32进行注册,因此代码不是主应用程序的一部分.因此我不能使用断点并以这种方式调试它.

我很确定组件内部发生了一些错误,但是没有传递,所以我看不出它是什么.

那么有谁知道如何调试这个?我可以以某种方式使OCX记录发生的任何错误,或使其显示错误,或者我该怎么办?

任何帮助将不胜感激 - 一直试图追踪错误3天,没有任何结果.

c++ debugging error-handling mfc activex

5
推荐指数
1
解决办法
1万
查看次数

嵌套的Math.Pow(...)表现得很奇怪

目前我正在将一些旧的C++代码重写为C#.当运行一些测试它没有按预期工作时,我开始调试,并且遇到了我似乎无法弄清楚的下面的内容.

因为我在课堂上做了很多数学并经常使用Math.Pow函数,所以我为它创建了一个快捷方法:

public double pow(double d, double p)
{
   return Math.Pow(d,p);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个如下代码行,它使用这种方法很多次:

double y = pow((pow(d12, 2) + pow(d13, 2) + pow(23, 2)), 2) - (2.0 * (pow(d12, 4) + pow(d13, 4) + pow(d23, 4)));
Run Code Online (Sandbox Code Playgroud)

这条线没有给出预期的结果,所以我开始把它分成小块,因为它应该被计算...例如,减号之前的值应该等于q5:

double q1 = pow(d12, 2);
double q2 = pow(d13, 2);
double q3 = pow(d23, 2);
double q4 = q1 + q2 + q3;
double q5 = pow(q4, 2);
Run Code Online (Sandbox Code Playgroud)

在这些线之后q5是8775553070736.0

然后我尝试将长线分成两部分,其中第一部分应该等于上面的5行,只写成一行:

double q12 = pow((pow(d12, 2) + pow(d13, 2) + pow(23, 2)), 2);
Run Code Online (Sandbox Code Playgroud)

我期望评估与q5相同,但事实并非如此.q12而是评估为4479508755225.0 …

c# math nested pow

4
推荐指数
1
解决办法
323
查看次数

fprintf和vfprintf在C++中有什么区别?

我无法找到以下问题的答案,而且我遇到了与功能有关的一些问题.

我的主要编程是在C#中完成的,在学习时从未真正学过C++,但在我目前的工作中,我还要做一些C++编程.

大多数C++编程都是由一名前员工完成的,他还创建了一个日志功能.

偶尔这个函数会导致错误(访问冲突) - 这不会向用户显示,但我在通过调试器运行代码时看到它.

当错误发生时,它指向这行代码:

vfprintf( LogFile, fmt, va );
Run Code Online (Sandbox Code Playgroud)

然后我仔细研究了之前和之后的代码,并将上面的代码置于上下文中,代码是:

void FileLog( char *fmt, ... )
{
  va_list       va;
  struct  time  t;
  struct  date  d;
  long          clk;
  static int    ReEntrant = 0;

  if( FileLogEnabled == false )
    return;

  ReEntrant++;
  if( ReEntrant > 1 )
    return;

  if( LogFile == NULL )
    LogFile = fopen( LogFileName, "a+" );
  if( LogFile != NULL )
  {
    gettime( &t );
    getdate( &d );
    fprintf( LogFile, "\n%d-%02d-%02d %2d:%02d:%02d.%02d0> ", d.da_year, d.da_mon, d.da_day, t.ti_hour, …
Run Code Online (Sandbox Code Playgroud)

c c++ printf access-violation

4
推荐指数
1
解决办法
7059
查看次数

标签 统计

c++ ×2

access-violation ×1

activex ×1

c ×1

c# ×1

debugging ×1

error-handling ×1

math ×1

mfc ×1

nested ×1

pow ×1

printf ×1