51Testing软件测试论坛

标题: loadrunner调用外部dll,不能正常退出的问题 [打印本页]

作者: overloadzy    时间: 2008-2-28 16:02
标题: loadrunner调用外部dll,不能正常退出的问题
Hi:
最近在做一个性能测试项目,需要在脚本中进行base64编码。
我在网上找到了一个做base64编码的dll。调用dll的过程是正常的,但是发现Vugen或controller在执行脚本时,会遇到报错或者无法退出的情况。请各位高手帮忙看看。
脚本中的关键步骤:
int status;
char *encoderequest=(char *)malloc(4096 * sizeof(char));
char *samlrequest=(char *)malloc(2048 * sizeof(char));

strcpy(samlrequest,"<Request xmlns=\"urnasis:names:tc:SAML:1.0:protocol\" xmlns:saml=\"urnasis:names:tc:SAML:1.0:assertion\" ");
strcat(samlrequest,"xmlns:samlp=\"urnasis:names:tc:SAML:1.0:protocol\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ");
......
lr_load_dll("MultiCoder.dll");
status=DoBASE64(samlrequest,strlen(samlrequest),encoderequest,4096,0);

lr_save_string(encoderequest,"encoderequest");

web_submit_data("AuthorizationDecisionServlet",
               "Action=http://10.11.11.55/jpassport-idp-web/servlet
               "Method=get",
               "RecContentType=text/xml",
               "Referer=",
               "Snapshot=",
               "Mode=HTTP",
               ITEMDATA,
                "Name=samlRequest", "Value={encoderequest}", ENDITEM,
               LAST);
...

free(encoderequest);
free(samlrequest);

其中DoBASE64是外部dll中的函数,声明为
extern "C" __declspec(dllexport) int DoBASE64(const unsigned char *idata, int idatalen, unsigned char *odata, int odatalen,int type);
//函数名:DoBASE64
//功能  :对输入字节流进行BASE64编码,得到可显示字符串
//参数  :idata 输入的需要进行BASE64编码的数据(指针)
//        idatalen 输入数据idata长度
//      :odata 存放经过BASE64编码的输出数据(指针)
//        odatalen 输出数据odata长度
//        type,加密/解密,整型,=EN0表示加密,DE1表示解密。

问题:
Vugen执行时偶尔脚本不能停止,除非手工杀mmdrv.exe进程,controller并发跑脚本的时候报错:
Error: Exception was raised when calling event-notify Vuser function in extension lrun50.dll: System Exceptions: EXCEPTION_ACCESS_VIOLATION
作者: overloadzy    时间: 2008-2-28 16:04
标题: 自己顶
另外,一个比较诡异的问题是:
DoBASE64之后,得到的encoderequest,在正常的base64编码后,多出很多其他字符。
请教大家:encoderequest是我定义的一个char*,开始的时候我并不知道encoderequest的长度是多少,所以给DoBASE64是一个比较大的4096,那么DoBASE64在返回了正常的base64编码后,会把其他后面的空间占满?
作者: overloadzy    时间: 2008-2-28 16:47
试了一下,使用多进程方式跑,controller也会报内存非法的错误。

恐怕是dll中相应函数内存使用的问题
作者: wgx2345    时间: 2008-2-28 16:56
有dll源代码么发上来看看
作者: liangjz    时间: 2008-2-29 22:26
建议用c 先写main函数单进程LoadLibrary 调用测试功能是否OK

然后再检查你写DLL的函数是否为多线程安全的,




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2