c - LR Controller 上的 "Error -- memory violation : Exception ACCESS_VIOLATION received"

标签 c performance loadrunner

场景:我们正在尝试从我们的网站下载 2500 个 PDF,我们需要找到该场景与应用程序的其他业务流程一起运行时的响应时间。我编写的用于动态选择和下载 PDF 的自定义代码在 vugen 甚至 Controller 上都可以很好地处理 200-300 个 PDF 的大小。但是,当我们运行相同的脚本并将 2500 个 PDF 加载到数据库时,该脚本在 vugen 上运行良好,但在 Controller 上出现内存不足的情况。我尝试在 Controller 上为并发用户 (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 名成员(member)

“%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");

虽然是为了嵌入参数但是徒劳

最佳答案

你可以尝试下面的方法。如果释放分配的内存,您在示例中不会执行此操作。

我改变了:

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

Action() 代码:

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 );

关于c - LR Controller 上的 "Error -- memory violation : Exception ACCESS_VIOLATION received",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31793477/

相关文章:

c - 链表实现

.net - MySQL数据库-基于用户量的性能

java - Jmeter - 将文件从一台主机复制到另一台主机

c - LoadRunner - 在 lr_eval_string 函数中使用 %d

c - 在C中输入大字符串

c - 为什么选择 Bitshift 运算符?

c - 类型转换函数参数

mysql - 500 个表有 100K-1M 行或 1 个表有 50-500M 行

git - 在大型存储库中创建 git 分支非常慢

c - 使用正则表达式识别一个特定字段