2012-05-03 35 views
5

Tôi có một DLL có một đầu vào chuỗi được mã hóa và giải mã nó. Các DLL đã được thực hiện trên một Win7 64-bit bằng cách sử dụng Codeblocks và mingw64. Các mã C một mình chạy tốt nhưng khi tôi chạy nó thông qua JNA trong một vòng lặp while với cùng một chuỗi nó được giải mã đúng cho khoảng 70% cuộc gọi và phần còn lại của nó không chính xác. Tôi muốn gỡ lỗi tình hình nhưng tôi không chắc chắn làm thế nào để làm điều đó sau khi mã Java tay kiểm soát đối với JNA. Ngoài ra bất kỳ ý tưởng về nơi để tìm cũng sẽ hữu ích.JNA C DLL Debug Howto?

Phương pháp chữ ký trong C và JNA như sau,

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

tính chính xác được xác định bởi đầu ra, ví dụ, nếu tôi lấy chuỗi "helloworld" mã hóa nó (tôi không đi sâu vào chi tiết mã hóa khi chúng không liên quan) sau đó chuyển đầu ra được mã hóa sang phương thức DLL này, 7 trong số 10 lần tôi nhận được "HelloWorld" khác 3 lần tôi sẽ nhận được các ký tự không chính xác và khác nhau. Và cho tất cả 10 lần tôi đang trong cùng một chủ đề bằng cách sử dụng cùng một biến, trong cùng một vòng lặp. 3 lần xuất hiện không chính xác cũng là ngẫu nhiên, điều duy nhất tôi có thể nhận thấy là lần chạy đầu tiên là LUÔN chính xác nhiều lần như tôi đã thử nghiệm nhưng chạy không chính xác xảy ra ở bất kỳ lần chạy 1-10 nào.

+0

[kiểm tra các liên kết ở dưới cùng] (http://web.archive.org/web/20081210024620/http://www.kineteksystems.com/white-papers/mixedjavaandc.html) – user1097489

+0

Bạn xác định "đúng đắn" của hoạt động? Nơi đầu tiên để xem xét sẽ là lỗi chuyển đổi giữa unsigned và signed ở đầu vào và đầu ra. – technomage

+0

Lưu ý rằng API của bạn đang đưa ra các giả định về định dạng của dữ liệu '' expkey'', cũng như kích thước của bộ đệm '' out''. – technomage

Trả lời

4

Trong Microsoft Visual C++, từ Cài đặt dự án cho dự án DLL, bạn có thể chọn tab Gỡ lỗi. Là tệp thực thi cho phiên gỡ lỗi, hãy cung cấp đường dẫn đầy đủ của Java.exe. Đối với các đối số, hãy cung cấp phần còn lại của dòng lệnh để chạy ứng dụng Java của bạn. Đặt điểm ngắt trong mã C của bạn và bắt đầu phiên gỡ lỗi. Thì đấy!