"错误 - 内存违规:收到异常ACCESS_VIOLATION"在LR控制器上

时间:2015-08-03 17:42:03

标签: c performance loadrunner

场景:我们正在尝试从我们的网站下载2500个PDF,我们需要在与应用程序的其他业务流程一起运行时查找此场景的响应时间。我编写的用于选择和下载PDF的自定义代码在vugen甚至控制器上都可以很好地处理200-300个PDF的大小。但是,当我们运行相同的脚本并将2500个PDF加载到数据库时,该脚本在vugen上工作正常,但是在控制器上内存不足。我尝试在控制器上为并发用户单独运行此脚本(20),即使这样,它也失败了同样的内存不足错误。一旦并发用户开始在服务器上运行,我就开始收到此错误。

我尝试了以下事项和观察结果:

1。我检查了我们正在使用的LG,并且在我收到此内存错误时没有高CPU使用率/内存使用率。

2。我尝试完全关闭日志记录,并关闭了错误"生成快照"。

3。我将网络缓冲区大小从默认的12KB增加到大约2MB的更高值,因为服务器响应了这个PDF大小。

4。此外,将JavaScript运行时内存值增加到更高的值,但我知道它与代码有关。

5。我已设置web_set_max_html_param_len("100000");

这是我的代码:

int download_size,i,m;
m=atoi(lr_eval_string("{DownloadableRecords_FundingNotices_count}"));
for(i=1;i<=m;i++)   
lr_param_sprintf("r_buf","%sselectedNotice=%s&",lr_eval_string("{r_buf}"),lr_paramarr_idx("DownloadableRecords_FundingNotices",i));
lr_save_string(lr_eval_string("{r_buf}"), "dpAllRecords");

我无法找到我的代码的问题,因为它在vugen中正常运行。

有一点是:它创建了巨大的mdrv.log文件以容纳所有2500个成员的格式如上所示

"%sselectedNotice=%s&"

我需要帮助。

好的,因为那不起作用而我找不到根本原因,我尝试用字符串缓冲区修改代码来保存值而不是参数。这次我的代码无法正常工作,我无法获得正确的格式化值,导致我的web_custom_request失败

所以,这是sprintf的代码

char *r_buf=(char *) malloc(55000);
int download_size,i,m;
m=atoi(lr_eval_string("{DownloadableRecords_FundingNotices_count}"));
for(i=1;i<=m;i++)   
sprintf(r_buf,"%sselectedNotice=%s&",r_buf,lr_paramarr_idx    ("DownloadableRecords_FundingNotices",i));
lr_save_string(r_buf, "dpAllRecords");

我也试过用这个:

lr_save_string(lr_eval_string("{r_buf}"), "dpAllRecords");

虽然是嵌入式参数但是徒劳无功

1 个答案:

答案 0 :(得分:1)

您可以尝试以下内容。如果释放分配的内存,那么在示例中就不会这样做。

我改变了:

  • 分配r_buf的方式
  • 如何填充r_buf(将sprintf()放入缓冲区并从缓冲区执行可能无法按预期工作)
  • 使用lr_paramarr_len()
  • 自由分配缓冲区!
  • 检查分配的缓冲区在循环中是否足够大

行动()代码:

char *r_buf;
char buf[2048];
int download_size,i,m;

// Allocate memory
if ( (r_buf= (char *)calloc(65535 * sizeof(char))) == NULL)
{
    lr_error_message ("Insufficient memory available");
    return -1;
}
memset( buf, 0, sizeof(buf) );

m = lr_paramarr_len("DownloadableRecords_FundingNotices");

for(i=1; i<=m; i++) {
  sprintf( buf, "selectedNotice=%s&", lr_paramarr_idx("DownloadableRecords_FundingNotices",i) );

  // Check buffer is big enough to hold the new data
  if ( strlen(r_buf)+strlen(buf) > 65535 ) {
    lr_error_message("Buffer exceeded");
    lr_abort();
  }

  // Concatenate to final buffer
  strcat( r_buf, buf ); // Bugfix: This was "strcat( r_buf, "%s", buf );"
}

// Save buffer to variable
lr_save_string(r_buf, "dpAllRecords");

// Free memory
free( r_buf );