2014-04-30 13 views
5

GDB phàn nàn rằng tệp nguồn của tôi gần đây hơn tệp thực thi và có vẻ thông tin gỡ lỗi thực sự liên quan đến phiên bản tệp nguồn cũ hơn, vì gdb là dừng trên một dòng trống:"Tệp nguồn gần đây hơn tệp thực thi" ngoại trừ không phải là

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000000 in ??() 
(gdb) up 
#1 0x00007ffff7ba2d88 in CBKeyPairGenerate (keyPair=0x602010) at library/src/CBHDKeys.c:246 
warning: Source file is more recent than executable. 
246 
(gdb) list 
241    if (versionBytes == CB_HD_KEY_VERSION_TEST_PUBLIC 
242      || versionBytes == CB_HD_KEY_VERSION_TEST_PRIVATE) 
243      return CB_NETWORK_TEST; 
244 
245    return CB_NETWORK_UNKNOWN; 
246 
247  } 
248 
249  uint8_t * CBHDKeyGetPrivateKey(CBHDKey * key) { 
250 

nhưng thực thi là gần đây nhiều hơn các tập tin nguồn, xem tại đây:

$ ls -l library/src/CBHDKeys.c 
-rw-r--r-- 1 matt matt 9249 Apr 29 22:40 library/src/CBHDKeys.c 
$ ls -l bin/noLowerAddressGenerator 
-rwxr-xr-x 1 matt matt 17845 Apr 30 15:52 bin/noLowerAddressGenerator 

tôi đã cố gắng xây dựng lại sau khi make cleanccache -C nhưng vấn đề tương tự xảy ra. Khi tôi cập nhật tệp nguồn, tôi chỉ thêm khoảng trắng, vì vậy logic chương trình vẫn bằng nhau. Tôi cảm thấy có liên quan gì đó với nó, nhưng vì tôi đã xóa ccache và dọn dẹp thư mục xây dựng và bin với make clean Tôi không chắc chắn đang xảy ra.

phiên bản:

  • GNU Make 3,81
  • gcc (Debian 4.8.2-16) 4.8.2
  • GNU gdb (GDB) 7.6.2 (Debian 7.6.2-1)
  • phiên bản 3.1.9 ccache
  • SolydXK - SMP Debian 3.13.5-1 (2014-03-04)
+1

'CBKeyPairGenerate' sẽ là tên hàm, 'noLowerAddressGenerator' là tệp thực thi. –

+0

Kiểm tra rõ ràng, nhưng: Tôi sẽ giả sử không có noLowerAddressGenerator khác xuất hiện trên đường dẫn mà gdb có thể được chọn lên? –

+0

Chỉ có một noLowerAddressGenerator và làm thế nào có thể gdb nhận được các tập tin hỗn hợp lên bất cứ nơi nào khi tôi vượt qua trong đường dẫn chính xác vào tập tin? –

Trả lời

0

Có lẽ bạn không sử dụng nhiều nhất phiên bản được biên dịch gần đây của mã, nếu nó nằm trong thư viện được chia sẻ. Bạn có thể sử dụng ldd noLowerAddressGenerator để xem phụ thuộc thư viện của chương trình của bạn; Tôi không biết nếu nó có thể từ bên trong GDB để xác định vị trí các thư viện có liên quan, nhưng có phải là một cách (xin vui lòng bình luận hoặc chỉnh sửa nếu bạn biết làm thế nào).

Nếu đây thực sự là trường hợp, bạn có thể muốn set environment LD_LIBRARY_PATH trong GDB trước khi chạy chương trình, để đặt thư viện mới xây dựng của bạn trước bất kỳ thư viện nào đã cài đặt. Bạn có thể xem xét đặt biến ELF RPATH khi liên kết, nhưng đó có thể là ít trợ giúp hơn.

Một khả năng khác là chạy trình gỡ rối của bạn trên hệ thống mà bạn biết thư viện chưa được cài đặt. Tôi đã có kết quả tốt bằng cách sử dụng schroot để tiếp tục xây dựng/gỡ lỗi/cài đặt các môi trường riêng biệt.

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