2013-07-08 28 views
7

gcc v4.8.x thêm tùy chọn để gỡ lỗi chương trình của bạn:Làm thế nào để sử dụng bộ lọc khử trùng của gcc v4.8.1?

-fsanitize = chủ đề

Enable ThreadSanitizer, một máy dò đua dữ liệu nhanh chóng. Hướng dẫn truy cập bộ nhớ sẽ được thiết lập để phát hiện lỗi chủng tộc dữ liệu. Xem http://code.google.com/p/data-race-test/wiki/ThreadSanitizer để biết thêm chi tiết.

phiên bản My gcc trên Fedora 19:

gcc version 4.8.1 20130603 (Red Hat 4.8.1-1) (GCC) 

Liên kết chương trình của tôi với bên dưới lệnh (đầu ra của CMake):

Linking C executable bin/ftu 
/usr/bin/cmake -E cmake_link_script CMakeFiles/ftu.dir/link.txt --verbose=1 
/usr/bin/cc -g -g -O0 -Wall -D_REENTRANT -rdynamic -fsanitize=thread -fPIE -pie CMakeFiles/ftu.dir/src/main/main.c.o -o bin/ftu -L/home/hl/ftu/arm/src/libapp/pc -rdynamic ../libapp/pc/libbase.a ../libapp/pc/libstbl.a ../libapp/pc/libstbl_utest.a ../libapp/pc/libbase_utest.a ../libapp/pc/libmem_utest.a ../libapp/pc/libmemspy_utest.a ../libapp/pc/libos_utest.a ../libapp/pc/libmain_utest.a ../libapp/pc/liblog_utest.a ../libapp/pc/libini_utest.a ../libapp/pc/libdsp_utest.a ../libapp/pc/libmstation_utest.a ../libapp/pc/libflist_utest.a ../libapp/pc/libdc_utest.a ../libapp/pc/libflist.a ../libapp/pc/libdsp.a ../libapp/pc/liblog.a ../libapp/pc/libini.a ../libapp/pc/libmstation.a ../libapp/pc/libdc.a ../libapp/pc/libmemspy.a ../libapp/pc/libmem.a ../libapp/pc/libos.a ../libapp/pc/libbase.a -lrt -lpopt -lpthread -Wl,-rpath,/home/hl/ftu/arm/src/libapp/pc 

/usr/bin/ld: cannot find -ltsan 

collect2: error: ld returned 1 exit status 

Gcc nói "không thể tìm thấy -ltsan". Libtsan tồn tại ở đâu?

tôi tìm thấy một cái gì đó trên http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer đã được thêm vào và có thể được kích hoạt thông qua -fsanitize = chủ đề. Hướng dẫn sẽ được thiết lập để phát hiện các cuộc đua dữ liệu. ThreadSanitizer có sẵn trên x86-64 GNU/Linux.

-fsanitize = thread chỉ hỗ trợ trên CPU 64 bit. My ra linux uname -a là:

Linux hl.zy 3.9.8-300.fc19.i686 # 1 SMP Thu 27 Tháng sáu 19:40:39 UTC 2013 i686 i686 i386 GNU/Linux

CPU của tôi là 32bit, Nó không hỗ trợ! Tôi có đúng không?

+0

Vì nó không được đề cập trong dòng lệnh liên kết nhưng bị phàn nàn bởi trình liên kết, khả năng cao là cài đặt của bạn bị lỗi. Trình biên dịch không nên chấp nhận tùy chọn '-fsanitize = thread' hoặc thư viện phải được cài đặt khi phần còn lại của GCC được cài đặt. Bạn đã xem ghi chú phát hành chưa? Bạn đã kiểm tra cấu hình trình biên dịch ('gcc -dumpspecs', v.v ...) chưa? –

+1

Tôi không quen thuộc với gcc, dưới đây là đầu ra của "gcc -dumpspecs | grep tsan":% {fsanitize = thread:% {static-libtsan:% {! Được chia sẻ: -Bstatic --whole-archive -ltsan - no-whole-archive -Bdynamic}}% {! static-libtsan: -ltsan}}}}% o – husthl

+0

_ "Tôi có đúng không?" _ Có. –

Trả lời

11

tôi đã làm một số thăm dò:

  1. tôi thấy sau đây trên http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer đã được thêm vào và có thể được kích hoạt thông qua -fsanitize = chủ đề. Hướng dẫn sẽ được thiết lập để phát hiện các cuộc đua dữ liệu. ThreadSanitizer có sẵn trên x86-64 GNU/Linux.

-fsanitize = thread chỉ được hỗ trợ trên CPU 64 bit. My linux uname -a kết quả đầu ra:

Linux hl.zy 3.9.8-300.fc19.i686 # 1 SMP Thu Tháng Sáu 27 19:40:39 UTC 2013 i686 i686 i386 GNU/Linux

của tôi CPU là 32 bit, Nó không được hỗ trợ!

  1. Tôi đã kiểm tra cấu hình trình biên dịch, như Jonathan Leffler nói

dưới đây là kết quả của "-dumpspecs gcc | grep tsan":

%{fsanitize=thread:%{static-libtsan:%{!shared:-Bstatic --whole-archive \ 
    -ltsan --no-whole-archive -Bdynamic}}%{!static-libtsan:-ltsan}}}} %o 

Nhưng Tôi không hiểu đầu ra.

  1. Tôi đã cài đặt Fedora 19 64 bit, bạn có thể cài đặt libtsan:

    sudo yum install libtsan.x86_64 
    

Concusion:

-fsanitize = chủ đề chỉ được hỗ trợ trên gcc 64 bit ngay bây giờ.

Các vấn đề liên quan