2012-10-31 24 views
8

Tôi đang sử dụng gdb để gỡ lỗi chương trình C++. Trong dònggỡ lỗi C++: ../nptl/sysdeps/unix/sysv/linux/raise.c: Không có tệp hoặc thư mục nào như vậy

assert(prevId == GetTagIdFromState(maxState)); 
  • tham số prevId giá trị là 0;
  • phương thức GetTagIdFromState(maxState)return s 50;

khi gỡ lỗi này, tôi nhận được các lỗi sau.

Assertion `prevId == GetTagIdFromState(maxState)' failed. 
Program received signal SIGABRT, Aborted. 
0x00007ffff6ecbba5 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
     in ../nptl/sysdeps/unix/sysv/linux/raise.c 
+0

Nếu có ai vấp phải điều này, tôi đã gặp lỗi tương tự. Những gì xóa nó lên cho tôi đã có một khóa đã bị khóa, nhưng không bao giờ phát hành. Tôi không chắc tại sao nó không chỉ bế tắc. Không biết nếu điều đó sẽ giúp đỡ, nhưng figured tôi vượt qua trên gotcha của tôi. – Homer6

Trả lời

7

Ứng dụng của bạn hoạt động như dự định. Xác nhận không thành công (vì các giá trị bạn chuyển cho nó không bằng nhau, macro assert nhận 0) và do đó chương trình của bạn bị hủy bỏ. Đó là cách khẳng định công việc:

Nếu NDEBUG không được định nghĩa, sau đó khẳng định kiểm tra nếu đối số của nó (mà phải có loại vô hướng) so sánh bằng số không. Nếu có, hãy xác nhận xuất ra thông tin chẩn đoán cụ thể về triển khai trên đầu ra lỗi chuẩn và gọi std :: abort.

điểm nhấn của tôi.

Kiểm tra this assert reference để biết thêm thông tin.

+5

Cảm ơn bạn trước. Tôi mới dùng C++. Tôi biết rằng xác nhận không thành công, nhưng bạn có thể cho tôi một số lời khuyên tại sao lỗi "../nptl/sysdeps/unix/sysv/linux/raise.c: Không có tệp hay thư mục như vậy". araises. Dường như chương trình không thể tìm thấy tệp. – wangzhiju

+4

Không có gì phải lo lắng. Macro khẳng định đang gọi (có thể gián tiếp) một hàm được gọi là nâng cao. Điều này đang xảy ra bên trong một thư viện mà bạn đang liên kết với mã của bạn. Khi thư viện đó được biên dịch (trên một số máy khác) có một tệp có tên '../nptl/sysdeps/unix/sysv/linux/raise.c', nhưng bây giờ khi nó đang chạy trên máy của bạn, tệp đó không còn tồn tại nữa. Nếu bạn muốn làm cho lỗi này biến mất thì có thể bạn phải tải xuống mã nguồn cho thư viện này. – john

+0

@wangzhiju, tốt, đánh giá từ đường dẫn, có vẻ như thư viện bạn đang sử dụng được biên dịch trên máy của nhà phát triển bằng cách sử dụng tệp '../ nptl/sysdeps/unix/sysv/linux/raise.c'. Vì không có tệp như vậy trên máy của bạn, bạn có lỗi. Nó không nên dẫn đến bất kỳ vấn đề mặc dù vậy bạn cũng có thể bỏ qua nó. – SingerOfTheFall

0

này sẽ đưa bạn lên đến tốc độ về việc sử dụng khẳng định chức năng

void assert (int expression); 

Đánh giá khẳng định Nếu biểu thức đối số của macro này với hình thức chức năng so sánh bằng số không (ví dụ, biểu thức là false), một tin nhắn được ghi vào thiết bị lỗi tiêu chuẩn và hủy bỏ được gọi, chấm dứt thực hiện chương trình.

Các chi tiết cụ thể của thông báo được hiển thị phụ thuộc vào việc triển khai cụ thể trong trình biên dịch, nhưng phải bao gồm: biểu thức có xác nhận không thành công, tên tệp nguồn và số dòng nơi nó xảy ra. Một định dạng biểu thức thông thường là:

Xác nhận không thành công: biểu thức, tên tệp, số dòng Macro này bị vô hiệu hóa nếu tại thời điểm bao gồm khẳng định.h macro có tên NDEBUG đã được xác định. Điều này cho phép một coder để bao gồm nhiều cuộc gọi khẳng định trong một mã nguồn trong khi gỡ lỗi chương trình và sau đó vô hiệu hóa tất cả chúng cho phiên bản sản xuất bằng cách đơn giản bao gồm một dòng như:

#define NDEBUG at the beginning of its code, before the inclusion of assert.h. 

Do đó, macro này được thiết kế để nắm bắt lỗi lập trình, không phải do người dùng hoặc lỗi chạy, vì nó thường bị tắt sau khi chương trình thoát khỏi giai đoạn gỡ lỗi của nó. từ: C++ Ref

0

Tôi vừa gặp phải lỗi này trong khi cố gắng gỡ lỗi chương trình trên Raspberry Pi. Chương trình sẽ xảy ra để sử dụng GPIO theo cách yêu cầu chương trình được chạy dưới dạng root.Ví dụ, tôi chạy chương trình tôi đã viết như thế này:

sudo ./foo 

Tôi quên này, tuy nhiên, khi bắt đầu lên trình gỡ lỗi, và cố gắng

gdb foo 

Và tôi đã nhận lỗi bạn dường như đã gặp :

Program received signal SIGABRT, Aborted. 
0x76cd0f70 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 

Khi tôi chạy nó bằng sudo, nó hoạt động tốt.

sudo gdb foo 

Hy vọng điều đó sẽ hữu ích cho người nào đó trên cùng một thuyền.

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