g++
được tạo bằng cách sử dụng mô hình ngoại lệ DWARF2
, sjlj
hoặc seh
. MinGW-builds cung cấp các bản dựng khác nhau của g++
có các kiểu ngoại lệ khác nhau. Tôi muốn có thể xác định từ chuỗi công cụ gcc
mô hình ngoại lệ nào đang được sử dụng. Có một đối số g++
sẽ đổ mô hình ngoại lệ mặc định của trình biên dịch không?Lấy mô hình ngoại lệ GCC hiện tại
Trả lời
Chỉnh sửa: Ban đầu, tôi đã thử nghiệm cờ cấu hình được mô tả trong g++ -v
. Như Jonathon Wakely chỉ ra trong các ý kiến, đây là không phải là một điều tốt để làm.
Một cách kiểm tra để làm điều đó là để biên dịch để lắp ráp:
struct S { ~S(); };
void bar();
void foo() {
S s;
bar();
}
Kết quả của g++ -S <filename> -o output.s
có tài liệu tham khảo sau ngoại lệ trong đó:
MinGW-4.8.1-x86-posix-sjlj
:
.def ___gxx_personality_sj0; .scl 2; .type 32; .endef
.def __Unwind_SjLj_Register; .scl 2; .type 32; .endef
.def __Unwind_SjLj_Unregister; .scl 2; .type 32; .endef
.def __Unwind_SjLj_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x86-posix-dwarf
:
.def ___gxx_personality_v0; .scl 2; .type 32; .endef
.def __Unwind_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x64-win32-sjlj
:
.def __gxx_personality_sj0; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Register; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Unregister; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x64-posix-seh
:
.def __gxx_personality_seh0; .scl 2; .type 32; .endef
.def _Unwind_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x64-posix-sjlj
:
.def __gxx_personality_sj0; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Register; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Unregister; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Resume; .scl 2; .type 32; .endef
FC17-g++-4.7.2-x64
:
.cfi_personality 0x3,__gxx_personality_v0
.globl __gxx_personality_v0
call _Unwind_Resume
Hình như chúng ta nên tìm kiếm __gxx_personality_([a-z])(0-9]+)
và sau đó so sánh nhóm chụp đầu tiên:
v
=dwarf
seh
=seh
sj
=sjlj
Điều này không đúng, vì [docs] (http://gcc.gnu.org/install/configure.html) nói, mặc định (tức là những gì được sử dụng khi bạn không sử dụng bất kỳ tùy chọn '--enable' hoặc' --disable' nào tùy thuộc vào nền tảng. –
Cảm ơn, Jonathan. Vẫn đang xem xét làm việc với mô hình ngoại lệ thông qua việc biên dịch mã. –
@JonathanWakely, tôi đã cập nhật câu trả lời, lấy cờ kiểm tra cấu hình, cảm ơn vì đã giúp đỡ điều đó. Tôi đã thêm một số ví dụ về việc biên dịch đoạn mã xử lý ngoại lệ mà tôi đã tìm thấy trong kịch bản cấu hình 'stdlibC++' và sau đó xem xét hội đồng để xác định các đặc tính cơ sở chính xác. Tôi đã sử dụng các thông tin sau làm tài liệu tham khảo: http://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf –
Chỉ cần để bổ sung cho các câu trả lời ở trên, GCC có một vĩ mô được xác định trước cho phép nhận tại thời gian biên dịch cho dù mô hình SJLJ ngoại lệ được sử dụng:
__USING_SJLJ_EXCEPTIONS__
Macro này là được định nghĩa, với giá trị 1, nếu trình biên dịch sử dụng cơ chế cũ dựa trên setjmp và longjmp để xử lý ngoại lệ.
Xem https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
Theo tài liệu, nó có sẵn ít nhất là từ phiên bản 3.1.1; Tôi vừa thử nghiệm nó trên GCC 7.1 (theo MinGW-w64).
- 1. Các mô hình xử lý ngoại lệ của GCC
- 2. Thực hiện xử lý ngoại lệ GCC C++
- 3. Lấy tên mô-đun hiện tại
- 4. mô hình django với hai khóa ngoại lệ chung (content_type)?
- 5. Common.Logging cấu hình ngoại lệ
- 6. Tại sao ngoại lệ .net không bị phát hiện?
- 7. Làm thế nào để gcc thực hiện ngăn xếp unrolling cho ngoại lệ C++ trên Linux?
- 8. Cách lấy văn bản ngoại lệ Python
- 9. ngoại lệ cấu hình log4net
- 10. Ngoại lệ Nullpointer tại com.sun.faces.config.InitFacesContext.cleanupInitMaps
- 11. RavenDB ném ngoại lệ sau khi thay đổi không gian tên mô hình
- 12. Django- Lấy mô hình khóa nước ngoài
- 13. Không tìm thấy dịch giả ngoại lệ tồn tại trong nhà máy đậu. Không thể thực hiện ngoại lệ dịch
- 14. Ngoại lệ OutOfMemory khi vẽ hình khối
- 15. Tôi có nên lấy ngoại lệ tùy chỉnh từ Ngoại lệ hoặc ApplicationException trong .NET không?
- 16. Lấy mô hình/tên lớp của mô hình Backbone
- 17. Tự động lấy số dòng hiện tại
- 18. Lấy màu hiện tại
- 19. cakephp sử dụng một mô hình khác bên trong mô hình hiện tại
- 20. Cách thích hợp để truy cập Mô hình Xem từ Mô hình Xem hiện tại
- 21. Lấy các chi tiết ngoại lệ trong Python
- 22. Tại sao tạo ngoại lệ tùy chỉnh?
- 23. Ngoại lệ tràn ngăn xếp — tại sao?
- 24. tại sao ngoại lệ này FileItemStream $ ItemSkippedException?
- 25. Ngoại lệ Weblogic Triển khai Ngoại lệ: PaddingException: Không thể thực hiện unpadding: byte pad không hợp lệ
- 26. ruby - tăng ngoại lệ với ngoại lệ
- 27. Mô hình hóa ý tưởng ném một ngoại lệ vào Biểu đồ hoạt động UML
- 28. ASP.NET MVC UpdateModel ném ngoại lệ: "Mô hình không thể được cập nhật"
- 29. Làm thế nào để mô phỏng ngoại lệ OutOfMemory
- 30. AWS.SimpleQueueService.NonExistentQueue Ngoại lệ được ném khi truy cập hàng đợi SQS hiện tại
Có vẻ như bạn có thể xác định xem gcc có đang sử dụng 'sjlj' hay không bằng cách kiểm tra kết xuất của trình biên dịch tìm kiếm' _Unwind_SjLj_Resume' hoặc '_Unwind_Resume' vì đó là [script cấu hình] (http://gcc.gnu.org) /git/?p=gcc.git;a=blob_plain;f=libstdc%2B%2B-v3/configure;hb=HEAD) cho 'libstdC++ 'không –
Bạn cũng có thể kiểm tra cho' enable-sjlj-exceptions' ở đầu ra của 'gcc -v' –