JNA C DLL 调试指南?

6
我有一个DLL,它接受一个经过编码的字符串输入并将其解码。该DLL是在Win7 64位上使用Codeblocks和mingw64制作的。C代码单独运行正常,但当我通过JNA在while循环中以同样的字符串运行它时,大约70%的调用已正确解码,其余的则不正确。我想调试这种情况,但不确定在Java代码将控制权移交给JNA后该如何操作。或者,任何关于哪里可以查找的想法也会很有帮助。
C和JNA中的方法签名如下:
Java: int Decrypt_Blk(byte[] expkey, byte[] in, int size, byte[] out);  
C: __declspec (dllexport) int Decrypt_Blk (unsigned char *expkey, unsigned char *in, unsigned int insize, unsigned char *out);

正确性是由输出确定的,例如,如果我将字符串“helloworld”加密(我不会涉及加密细节,因为它们无关紧要),然后将加密输出传递给此DLL方法,我有10次中的7次会得到“HelloWorld”,另外3次我会得到不正确和不同的字符。而且在所有10次中,我都在同一个线程中使用相同的变量,在同一个循环中。这3个不正确的出现也是随机的,我能注意到的唯一一件事是第一次运行始终是正确的,就像我测试过的那样,但是不正确的运行发生在1-10次中的任何一次。


请查看下方链接:http://web.archive.org/web/20081210024620/http://www.kineteksystems.com/white-papers/mixedjavaandc.html - user1097489
你是如何确定操作的“正确性”的?首先要查找的地方是输入和输出之间无符号和有符号转换错误。 - technomage
请注意,您的API对“expkey”数据的格式以及“out”缓冲区的大小做出了假设。 - technomage
感谢 @technomage,目前为止,我们为了测试而固定了 out 的大小,但是假设在运行时它可以变化吗?它有70%的时间运行良好。不过,我将尝试使用 ByteBuffer 而不是 byte[] 来避免任何与大小相关的问题。再次感谢。 - iahsan
任何输出缓冲区的大小都应该在调用函数时指定,以便它可以避免任何覆盖的可能性。这种缓冲区的覆盖是许多安全漏洞(更不用说间歇性程序崩溃)的根源。 - technomage
它是否在相同的输入下70%的时间内正常运行,或者在您提供的70%输入上正常运行并在其他30%上失败?如果是前者(即问题是非确定性的),请查看GC、堆栈和内存相关的使用情况。如果是后者,请检查两种类型输入之间的差异。 - technomage
1个回答

6

在Microsoft Visual C++中,从DLL项目的“项目设置”中,您可以选择“调试”选项卡。作为调试会话的可执行文件,请提供Java.exe的完整路径。对于参数,请提供运行Java应用程序的其余命令行。在您的C代码中设置断点并启动调试会话。就这样!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接