Luận văn sử dụng chỉ số đánh giá Expense để đánh giá hiệu quả của các loại phổ trong định vị lỗi. Luận văn so sánh hiệu quả của phổ ESHS, DHS, DHS-def, DHS-use khi sử dụng 12 chỉ số xếp hạng được mơ tả trong Bảng 2.2.
Các Hình 4-1, Hình 4-2, Hình 4-3, Hình 4-4, Hình 4-5, Hình 4-6 mô tả biểu đồ so sánh điểm Expense của các phổ tương ứng với kỹ thuật tương ứng barinel, drt, dstar, jaccard, kulczynski2, mccon, minus, ochiai, op, tarantula, wong3 và zoltar. Với mỗi biểu đồ, trục x thể hiện phần trăm mã được kiểm tra, trục y thể hiện phần trăm phiên bản lỗi được định vị bằng cách kiểm tra lượng mã nhỏ hơn hoặc bằng tương ứng với giá trị trục x.
(a) Barinel (b) DRT
Hình 4-1: Điểm Expense của Barinel và DRT
Các phổ DHS thể hiện hiệu quả tốt hơn phổ ESHS với hầu hết chỉ số xếp hạng. Với các chỉ số xếp hạng Mccon, Op và Wong3 sự chênh lệch này không nhiều. Đường đồ thị điểm Expense của các chỉ số xếp hạng này gần như tương đồng nhau. Ngược lại, Barinel, Dstar, Jaccard, Ochiai và Tarantula thể hiện chênh lệch rõ rệt, điều này tương đương khả năng định vị lỗi với các phổ DHS hiệu quả hơn nhiều. Như Hình 4-1, chúng ta có thể xác định được 83% lượng lỗi bằng cách kiểm tra 30% mã chương trình khi sử dụng kỹ thuật Barinel và phổ DHS-use. Số lượng mã cần kiểm tra nhiều khi dùng kỹ thuật Barinel và phổ ESHS, 40% số câu
lệnh của chương trình. Số lượng mã cần kiểm tra của phổ DHS và DHS-def khoảng 35%.
(a) Dstar (b) Jaccard
Hình 4-2: Điểm Expense của Dstar và Jaccard
Tương tự như Barinel, Dstar và Jaccard cũng thể hiện hiệu quả định vị lỗi với phổ DHS-use và DHS-def (như trong Hình 4-2). Khi kiểm tra 40% mã chương trình, phổ DHS-use có thể chỉ ra 81% lỗi với kỹ thuật Dstar, phổ DHS có thể chỉ ra 76% lỗi. Phổ ESHS và DHS có hiệu quả kém hơn khi chỉ có thể chỉ ra 73% lỗi. Kỹ thuật Jaccard và phổ ESHS lại tìm được nhiều lỗi hơn khi kiểm tra 50% câu lệnh của chương trình. Phổ ESHS tìm được 91% số lỗi, nhiều hơn 5% so với các phổ DHS, DHS-def và DHS-use.
(a) Kulczynski2 (b) Mccon
(a) Minus (b) Ochiai
Hình 4-4: Điểm Expense của Minus và Ochiai
(a) Op (b) Tarantula
Hình 4-5: Điểm Expense của Op và Tarantula
Kỹ thuật Tarantula cho thấy hiệu quả khác biệt rõ rệt giữa các loại phổ được thể hiện trong Hình 4-5. Phổ DHS-use ln thể hiện hiệu tốt hơn các phổ dựa trên cặp def-use còn lại như DHS và DHS-def. Đường điểm Expense của phổ DHS- use luôn nằm bên trên các đường điểm Expense của phổ DHS và DHS-def. Ở khoảng kiểm tra trước 50% mã chương trình, điểm Expense của phổ DHS-use cũng xác định được nhiều lỗi hơn các loại phổ còn lại.
(a) Wong3 (b) Zoltar
Hình 4-6: Điểm Expense của Wong3 và Zoltar
Các Hình 4-7, Hình 4-8, Hình 4-9, Hình 4-10 so sánh hiệu quả của tất cả các kỹ thuật định vị lỗi (hay chỉ số xếp hạng) với phổ ESHS, DHS, DHS-use và DHS- def. Với tất cả các phổ, các kỹ thuật tìm ra số lượng lỗi gần như tương đồng nhau. Số lượng lỗi tìm ra giữ các kỹ thuật chênh lệch không quá 10% tổng lượng lỗi của thử nghiệm.
Với phổ ESHS, kỹ thuật Wong3 có hiệu quả thấp nhất và kỹ thuật Barinel và DRT có hiệu quả cao nhất. Với cách kiểm tra 60% mã chương trình, các kỹ thuật Barinel và DRT định vị lỗi hiệu quả hơn 10% so với kỹ thuật Wong3.
Hình 4-7: Hiệu quả định vị lỗi của các kỹ thuật với phổ ESHS
Chỉ số xếp hạng Ochiai có đường điểm Expense ổn định hơn với các kỹ thuật khác khi kết hợp với các phổ DHS, DHS-def và DHS-use.
Hình 4-9: Hiệu quả định vị lỗi của các kỹ thuật với phổ DHS-def
Hình 4-10: Hiệu quả định vị lỗi của các kỹ thuật với phổ DHS-use
Cơng cụ Zoltar khơng cịn sử dụng được do khơng được duy trì cập nhật. Nên luận văn khơng thể thực hiện thực nghiệm so sánh hiệu quả điều chỉnh mã nguồn giữa HiFa và Zoltar. Thay vào đó, luận văn đã thực hiện so sánh HiFa và GCC, một công cụ hỗ trợ điều chỉnh mã nguồn.
Bảng 4.2 thể hiện so sánh kích thước tệp thực thi của từng chương trình và kích thước dữ liệu phổ thu thập được sau khi thực thi bộ kiểm thử giữ công cụ
HiFa và GCC. Cột đầu tiên là danh sách các chương trình thử nghiệm. Các cột 2, 3, 4 thể hiện kích thước tệp thực thi tính theo byte tương ứng với biên dịch bởi GCC, biên dịch bởi HiFa cho phổ ESHS và biên dịch với HiFa cho phổ DHS. Các cột tiếp theo 4, 5 và 6 là kích thước phổ dữ liệu thu được sau khi thực hiện kiểm thử tương ứng với cách điều chỉnh mã nguồn bằng GCC, bằng HiFa cho phổ ESHS và HiFa cho phổ DHS. GCC là trình biên dịch cho ngơn ngữ C/C++, hỗ trợ điều chỉnh mã nguồn để lấy thông tin thực thi của từng câu lệnh. Kết quả so sánh cho thấy các tệp thực thi được biên dịch bằng cơng cụ HiFa có kích thước lên hơn nhiều so với tệp thực thi được biên dịch bằng GCC. Tệp thực thi được biên dịch bởi HiFa có kích thước lớn hơn 3 – 4 lần kích thước tệp thực thi được biên dịch bằng GCC. Tệp thực thi của phổ DHS cũng có kích thước lớn hơn của phổ ESHS. Sự khác biệt này là do số lượng cặp def-use ln nhiều hơn số câu lệnh của chương trình, nên cần bổ sung nhiều thơng tin hơn để có thể lấy phổ DHS. Tuy có kích thước tệp thực thi cao hơn, nhưng các chương trình được điều chỉnh bởi HiFa tạo ra tệp dữ liệu phổ thấp hơn so với GCC. Kích thước dữ liệu phổ thu được sau thi kiểm thử chương trình điều chỉnh bằng GCC cao hơn 4-5 lần chương trình điều chỉnh bằng HiFa cho phổ ESHS. Chương trình có số lượng testcase càng lớn thì sự chênh lệch này càng cao, chương trình replace có 5542 testcase thì kích thước tệp dữ liệu phổ chênh lệch là 5.8 lần, chương trình tot_info có bộ kiểm thử nhỏ hơn (1052 testcase) thì chênh lệch chỉ là 3.3 lần. Từ kết quả này cho thấy phương pháp điều chỉnh mã nguồn để thu thập thông tin phổ của HiFa có hiệu quả tốt hơn GCC, đặc biệt với các chương trình có bộ kiểm thử lớn.
Bảng 4.2: Kích thước tệp thực thi của từng chương trình
Chương trình Kích thước tệp thực thi Kích thước dữ liệu phổ
GCC ESHS DHS GCC ESHS DHS print_tokens 47 163 167 7357 1440 2078 print_tokens2 43 156 164 7250 1507 2022 schedule 43 150 150 3354 619 867 schedule2 43 150 153 3409 580 790 replace 43 165 273 10803 2257 3903 tcas 34 144 144 1426 175 178 tot_info 41 159 166 573 171 373
Chương 5 Kết luận
Luận văn này đã nghiên cứu các kỹ thuật định vị lỗi hiện nay như: các kỹ thuật truyền thống (Logging, Assertions, BreakPoints, Profiling); các kỹ thuật nâng cao (dựa trên phổ chương trình, dựa trên lát cắt, dựa trên trạng thái, dựa trên mơ hình, dựa trên xác suất, dựa trên học máy, dựa trên khai phá dữ liệu). Luận văn đã đi sâu vào tìm hiểu kỹ thuật định vị lỗi dựa trên phổ chương trình do kỹ thuật này được sử dụng phổ biến và dễ dàng tiếp cận. Luận văn đã bổ sung phổ DHS cho các kỹ thuật định vị lỗi dựa trên phổ và phát triển công cụ định vị lỗi dựa trên phổ chương trình HiFa cho các chương trình C/C++. Hiện tại, cơng cụ HiFa tích hợp sẵn 13 kỹ thuật định vị lỗi dựa trên phổ chương trình: ochiai, tarantula, jaccard, op, barinel, dstar, kulczynski2, mccon, zoltar, wong3, drt, minus và ochiai2. Bên cạnh phổ ESHS (câu lệnh) đã được sử dụng ở các nguyên cứu về kỹ thuật định vị lỗi dựa trên phổ chương trình trước đây, cơng cụ bổ sung thêm các phổ DHS. Luận văn đưa ra các thử nghiệm thực tế công cụ với các bộ dữ liệu lỗi chuẩn của bộ Siemens, các chương trình grep, sed, space. Các thử nghiệm trên các bộ dữ liệu lỗi được thực hiện để đánh giá khả năng định vị lỗi của kỹ thuật sử dụng phổ DHS và phổ ESHS. Kết quả cho thấy kỹ thuật sử dụng phổ DHS, DHS-def, DHS-use có khả năng định vị lỗi hiệu quả hơn kỹ thuật sử dụng phổ ESHS. Với bộ dữ liệu được thử nghiệm, các kỹ thuật Barinel, Dstar, Jaccard, Ochiai và Tarantula sử dụng các phổ DHS chỉ ra nhiều hơn 10% lỗi so với phổ ESHS khi thực hiện kiểm tra 30% mã của chương trình. Từ kết quả này, ta thấy được công cụ định vị lỗi có tiềm năng và khả năng ứng dụng cao trong quá trình phát triển phần mềm C/C++. Cơng cụ giúp nhà phát triển giảm thiểu chi phí, thời gian cho quá trình gỡ lỗi của hệ thống.
Với các kết quả đạt được, thời gian tiếp theo luận văn sẽ mở rộng khả năng hỗ trợ các ngơn ngữ lập trình khác cho cơng cụ HiFa như Objective-C, Python, Scala, … Cùng với đó cơng cụ HiFa cũng sẽ được áp dụng kỹ thuật định vị nhiều lỗi. Trong thực tế, một chương trình phần mềm khơng chỉ có một lỗi đơn lẻ mà nó có thể có nhiều lỗi đồng thời gây ra kết quả kiểm thử khơng thành cơng. Q trình gỡ lỗi chương trình thường được thực hiện gỡ từng lỗi đơn lẻ một. Nhà phát triển có thể kiểm tra một trường hợp kiểm thử khơng thành cơng để cố gắng tìm ra câu lệnh lỗi bằng các kỹ thuật gỡ lỗi hiện có hoặc có thể sử dụng tất cả các ca kiểm thử không thành công bằng các kỹ thuật định vị lỗi. Sau khi một lỗi được
tìm thấy và sửa lỗi, chương trình phải được kiểm thử lại với bộ kiểm thử để xác định các ca kiểm thử khơng thành cơng trước đây có thành cơng hay khơng. Nếu lỗi vẫn cịn thì q trình gỡ lỗi sẽ được lặp lại. Để giảm tổng thời gian và chi phí cho q trình gỡ lỗi, có thể có nhiều hơn một nhà phát triển tham gia quá trình gỡ lỗi song song. Để thực hiện điều này cần có một kỹ thuật định vị lỗi có thể phát hiện sự hiện diện của nhiều lỗi và ánh xạ chúng thành các tập hợp thử nghiệm không thành công để chỉ định cho các nhà phát triển khác nhau.
Tài liệu tham khảo Tài liệu tiếng Việt
[2] Phạm Ngọc Hùng, Trương Anh Hồng, Đặng Văn Hưng, Giáo trình kiểm thử phần mềm, Nhà xuất bản Đại học Quốc gia Hà Nội, 2014.
[33] “Tìm hiểu chung về LLVM,” viblo, [Trực tuyến]. Available: https://viblo.asia/p/tim-hieu-chung-ve-llvm-1VgZv6zMZAw.
Tài liệu tiếng Anh
[1] IEEE, Ieee standard glossary of software engineering terminology (ieee std 610.12-1990), 1990.
[3] James A. Jones, Mary Jean Harrold, "Empirical Evaluation of the Tarantula Automatic Fault-Localization Technique," in Proc. Int. Conf. Autom. Softw.
Eng., CA, USA, 2005.
[4] "dblp computer science bibliography," [Online]. Available: https://dblp.uni- trier.de/.
[5] W. Eric Wong, Ruizhi Gao, Yihao Li, Rui Abreu, and Franz Wotawa, "A Survey on Software Fault Localization," IEEE Transactions on Software Engineering, 2016.
[6] M. Weiser, "Program slicing: formal, psychological, and practical investigations of an automatic program abstraction method," Ph.D. dissertation, Univ. Michigan, Ann Arbor, MI, USA, 1979.
[7] J. R. L. a. M. Weiser, "Automatic program bug location by program slicing," in Proc. Int. Conf. Comput. Appl., 1987.
[8] H. Agrawal, J. R. Horgan, "Dynamic program slicing," in Proc. ACM SIGPLAN Conf. Program. Language Des. Implementation, NY, USA, 1990.
[9] X. Zhang, N. Gupta, R. Gupta, Locating faulty code by multiple points slicing, Softw. Practice Experience, 2007.
[10] H. Agrawal, J. R. Horgan, S. London, W. E. Wong, "Fault localization using execution slices and dataflow tests," in Proc. 6th Int. Symp. Softw. Rel. Eng., Toulouse, France, 1995.
[11] H. Agrawal, J. R. Horgan, J. J. Li, S. London, W. E. Wong, S.Ghosh, N. Wilde, "Mining system tests to aid software maintenance," IEEE Comput.,
vol. 31, no. 7, 1998.
[12] W. E. Wong, J. J. Li, "An integrated solution for testing and analyzing java applications in an industrial setting," in Proc. AsiaPacific Softw. Eng. Conf., Taipei, Taiwan, 2005.
[13] Rui Abreu, Peter Zoeteweij, Arjan J. C. van Gemund, "On the accuracy of spectrum-based fault localization," in Proc. Testing: Academic Ind. Conf. Practice Res. Techn., CT, USA, 2007.
[14] Mike Y. Chen, Emre Kiciman, Eugene Fratkin, Armando Fox, Eric Brewer, "Pinpoint: Problem determination in large, dynamic internet services," in
Proceedings of the 42nd Annual IEEE/IFIP International Conference on Dependable Systems and Networks, 2002.
[15] T. Janssen, R. Abreu, and A. J.C. van Germund, "Zoltar: A Spectrum-based Fault Localization Tool," Proc. ESEC/FSE Workshop Softw. Integr. Eval., Amsterdam, The Netherlands, 2009.
[16] Lee Naish, Hua Jie Lee, and Kotagiri Ramamohanarao, "A model for spectra-based software diagnosis," J. ACM Trans. Softw. Eng. Methodol.,
vol. 20, no. 3, 2011.
[17] W. Eric Wong, Vidroha Debroy, Byoungju Choi, "A family of code coverage-based heuristics for effective fault localization," J. Syst. Softw.,
[18] Lee Naish, Hua Jie Lee, Kotagiri Ramamohanarao, "Spectral debugging with weights and incremental ranking," in Proc. Asia-Pacific Softw. Eng. Conf., Batu Ferringhi, Malaysia, 2009.
[19] Jian Xu, Zhenyu Zhang, W. K. Chan, T. H. Tse, and Shanping Li, "A Dynamic Fault Localization Technique with Noise Reduction for Java Programs," in Proc. Int. Conf. Quality Softw., Madrid, Spain, 2011.
[20] R. Abreu, P. Zoeteweij, and A. J. van Gemund, "Spectrum-based multiple fault localization," in Proc. 24th IEEE/ACM Int. Conf. Automated Softw. Eng., CA, USA, 2009.
[21] W. E. Wong, V. Debroy, R. Gao, and Y. Li, "The DStar method for effective software fault localization," IEEE Trans. Rel., vol. 63, no. 1, 2014.
[22] Marcos L. Chaim, José C. Maldonado, Mario Jino, "A debugging strategy based on requirements of testing," in Proceedings of the 7th European Conference on Software Maintenance and Reengineering, CSMR’03, 2003.
[23] B. Liblit, M. Naik, A. X. Zheng, A. Aiken, M. I. Jordan, "Scalable statistical bug isolation," in Proc. ACM SIGPLAN Conf. Programm. Language Design
Implementation, Chicago, IL, USA, 2005.
[24] C. Liu, L. Fei, X. Yan, J. Han, S. P. Midkiff, "Statistical debugging: A hypothesis testing-based approach," IEEE Trans. Softw. Eng., vol. 32, no.
10, 2006.
[25] W. C. T. T. Y. Y. P. H. Zhenyu Zhang, "Non-parametric statistical fault localization," J. Syst. Softw., vol. 84, no. 6, 2011.
[26] W. E. Wong, V. Debroy, D. Xu, "Towards better fault localization: A crosstab-based statistical approach," IEEE Trans. Syst. Man Cybern. C, Appl. Rev., vol. 42, no. 3, 2012.
[27] A. Zeller, R. Hildebrandt, "Simplifying and isolating failure inducing input,"
[28] X. Zhang, N. Gupta, R. Gupta, "Locating Faults Through Automated Predicate Switching," in Proc. Int. Conf. Softw. Eng., Shanghai, China,
2006.
[29] W. E. Wong, Y. Qi, "BP neural network-based effective fault localization,"
Int. J. Softw. Eng. Knowl. Eng., vol. 19, no. 4, 2009.
[30] L. C. Briand, Y. Labiche, X. Liu, "Using machine learning to support debugging with tarantula," in Proc. IEEE Int. Symp. Softw. Rel., Trolhattan, Sweden, 2007.
[31] S. Nessa, M. Abedin, W. Eric Wong, L. Khan, Y. Qi, "Fault localization using N-gram analysis," in Proc. Int. Conf. Wireless Algorithms, Syst. Appl, 2009.
[32] Mary Jean Harrold, Gregg Rothermel, Kent Sayre, Rui Wu, Liu Yi, "An Empirical Investigation of the Relationship Between Spectra Differences and Regression Faults," J. Softw. Testing, Verification Rel., vol. 10, no. 3, 2001.
[33] Jian Xu, Zhenyu Zhang, W. K. Chan, T. H. Tse, Shanping Li, "A general noise-reduction framework for fault localization of java programs," Inf. Softw. Technol., vol. 55, no. 5, 2013.
[34] "The LLVM Compiler Infrastructure," [Online]. Available: https://llvm.org/.
[36] N. S. Foundation, "Software-artifact Infrastructure Repository," [Online]. Available: https://sir.csc.ncsu.edu/portal/usage.php.
[37] Y. K. M. K. Seokhyeon Moon, "Ask the Mutants: Mutating Faulty Programs for Fault Localization," in Proceedings of the 7th IEEE International Conference on Software Testing, Verification and Validation, 2014.