2017-05-08 19 views
6

Hãy bắt đầu với mô tả những gì đang xảy ra:SDL2 & GDB: tín hiệu nhận được chương trình ?, tín hiệu không xác định

Tôi đang phát bằng thư viện SDL2 trên Windows. Tôi có thể biên dịch chương trình bằng cách sử dụng nó, và khi tôi chạy .exe nó hoạt động tốt. Các vấn đề phát sinh khi tôi cố gắng gỡ lỗi bằng GDB - khi mã đến SDL_Init hoặc các chức năng SDL_OpenAudio (có thể tạo chủ đề mới), GDB dừng lại, hiển thị thông báo "tín hiệu chương trình nhận được, tín hiệu không xác định" và khi tôi tiếp tục thực hiện chương trình bị treo.

Dường như có lỗi trong GDB (https://www.mail-archive.com/[email protected]/msg149735.html) liên quan đến việc đặt tên chuỗi và phải được sửa trong phiên bản GD1 7.11.1-1.

Lúc đầu, tôi đã sử dụng GCC 5.1.0 (TDM) với GDB 7.6.1, vì vậy tôi quyết định cập nhật lên phiên bản mới hơn. Dường như TDM không cung cấp bất kỳ bản cập nhật nào kể từ khoảng hai năm trước, vì vậy tôi đã cài đặt MinGW-w64 (tôi không nhớ bây giờ, nhưng nó có thể là phiên bản 7.11 của GDB). Đã không giúp đỡ, GDB stil bị treo.

Tiếp theo, tôi đã tìm kiếm phiên bản GDB mới hơn và tìm thấy 7.12 (phương trình chấm chấm dot com/servlet/equation.cmd? Fa = gdb). Đã không làm việc, quá, có thể sửa chữa đã không làm cho nó vào phiên bản này.

Rõ ràng lỗi này chỉ nên có trong phiên bản x86 của GDB, vì vậy tôi đã cài đặt phiên bản x64 của TDM (GCC 5.1.0 và GDB 7.9.1). Chương trình được biên soạn tốt, nhưng GDB vẫn bắt được tín hiệu và chương trình không xác định bị treo.

Hiện tại, tôi không thể gỡ lỗi bất kỳ chương trình nào bằng SDL2. Vì vậy, câu hỏi là, tôi có thể làm gì để nó hoạt động trở lại?


giải pháp có thể:

  • Sử dụng Visual Studio - Tôi thích Eclipse (và điều đó có nghĩa là tôi bắt đầu chịu đựng những thứ tôi không thích ở trong đó) và không thực sự muốn học hoàn toàn mới IDE, nhưng tôi sẽ giữ nó như là tùy chọn cuối cùng.
  • Biên dịch GDB - đã thử, không hoạt động, biên dịch mọi thứ trên Windows hầu như không bao giờ hoạt động đối với tôi và GDB 7.12 cũng có lỗi này.
  • Chuyển sang Linux - Ngay cả tùy chọn cấp tiến hơn chuyển sang Visual Studio.
  • Quay lại SDL 1.2 - Mọi thứ trở lại dễ dàng hơn ...
  • Chuyển sang bất kỳ thư viện nào khác - ... và hy vọng họ sẽ hợp tác với GDB. Điều đó không thực sự giống như một giải pháp.
  • Chuyển sang trình biên dịch khác?
  • Tắt đặt tên chuỗi?

mẫu Mã số:

#include <SDL2/SDL.h> 

// Normally I'd use #undef main 
int WinMain(int, char**) 
    { 
    SDL_Init(SDL_INIT_EVERYTHING); 

    return 0; 
    } 

Compilation: g ++ gdbtest.cpp -lSDL2main -lSDL2

SDL2 phiên bản: 2.0.5 (mới nhất xây dựng cho Windows, MinGW, phiên bản 32bit)


Chạy bình thường: a.exe

Kết quả: bắt đầu chương trình và kết thúc thường

Chạy với GDB: Console log

Kết quả: GDB nhận tín hiệu không rõ, chương trình bị treo

+0

Không có nhiều thứ để tiếp tục. Bạn có thể đăng một số mã tối thiểu để giúp chúng tôi hiểu không? Đăng thêm về môi trường của bạn - các thư viện chính xác mà bạn đã sử dụng, các đối số dòng lệnh được sử dụng để biên dịch và liên kết, v.v. – Leonardo

+0

Xong - mã tối thiểu như nó có thể nhận được. – crueltear

Trả lời

3

Ok, tôi nghĩ tôi đã tìm thấy hai cách để giải quyết vấn đề này. Nguồn của vấn đề nằm trong cách xử lý GDB (hoặc ít nhất là phải xử lý) đặt tên luồng. Để đặt tên cho một chủ đề, người ta phải tăng ngoại lệ với các thuộc tính cụ thể. SDL2 thực hiện điều này trong SDL_SYS_SetupThread chức năng nằm ở SDL2-2.0.5/src/thread/windows/SDL_systhread.c: 168:

RaiseException(0x406D1388, 0, sizeof(inf)/sizeof(ULONG), (const ULONG_PTR*) &inf); 

tùy chọn đầu tiên là nhận xét dòng này và biên dịch lại thư viện (tốt, biên dịch nó là một vấn đề trong chính nó). tùy chọn thứ hai là thêm:

SDL_SetHint(SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING, "1"); 

đâu đó đầu trong mã - trong chức năng SDL_SYS_SetupThread có một cuộc gọi đến SDL_GetHintBoolean trả về từ chức năng mà không cần đặt tên bất cứ điều gì nếu SDL_HINT_WINDOWS _... là sai.

Tuy nhiên, tìm cách xung quanh lỗi này không có nghĩa là nó sẽ không trở lại ám ảnh tôi từ một số thư viện khác đặt tên cho chuỗi của nó.

3

Dựa trên những thông tin mới của bạn, tôi có thể tái tạo vấn đề của bạn thành công và quản lý để thu hẹp nguyên nhân của nó (nhưng không phải nguyên nhân gốc rễ hoặc vấn đề). Nhưng trước tiên, một số cân nhắc về cách bạn đang biên soạn và liên kết chương trình của bạn:

  • #include <SDL2/SDL.h>: Tôi muốn thay đổi điều đó để #include "SDL.h" và điều chỉnh bao gồm đường dẫn với -I để trỏ đến thư mục bao gồm của SDL. Bằng cách này, mã của bạn dễ di chuyển hơn, vì lệnh sdl2-config xuất ra các cờ sẽ được chuyển tới trình biên dịch và -I là một trong số chúng.
  • // Normally I'd use #undef main: Đừng làm điều này, không cần thiết. Những gì bạn cần làm là điều chỉnh liên kết và tùy chọn biên dịch của bạn. "thủ thuật chính của SDL2" phải hoạt động như mong đợi.
  • g++ gdbtest.cpp -lSDL2main -lSDL2: Cờ liên kết chính xác cho Windows thường, như được chỉ ra bởi this wiki entry: -lmingw32 -lSDL2main -lSDL2 -mwindows.
  • return 0: xin đừng quên gọi SDL_Quit() vào cuối đơn đăng ký của bạn.

Bây giờ, vấn đề bạn đang gặp phải là cờ nào đó truyền cho SDL_Init nguyên nhân gdb thất bại (trong quá khứ, tôi nhớ rằng một số trong số họ dẫn đến treo up, nó không phải là trường hợp nữa). Vì vậy, để trực tiếp giải quyết vấn đề của bạn, thay vì đi qua SDL_INIT_EVERYTHING, tôi trôi qua

SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_HAPTIC | SDL_INIT_EVENTS 

rời ra như sau:

SDL_INIT_TIMER | SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER 

gdb a.exe chạy bình thường.

Như tôi đã nói trước đây, tôi không đi sâu hơn nữa để kiểm tra lý do khiến GDB thất bại, nhưng đây chắc chắn là một lỗi đáng báo cáo. Tôi muốn đi đến https://bugzilla.libsdl.org/, tìm kiếm một simillar lỗi cho nó và tạo ra nếu không tìm thấy.

+0

Việc bỏ những lá cờ đó thực sự khắc phục được chương trình mẫu của tôi, tuy nhiên nó bị treo khi tôi thêm SDL_OpenAudio hoặc MIX_OpenAudio. Điều này dường như xảy ra mỗi khi một chuỗi được tạo và đặt tên (tôi đoán rằng SDL_INIT_TIMER bắt đầu một chuỗi). Mỗi phiên bản GDB tôi đã thử dường như không hỗ trợ điều đó. – crueltear

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