Falha de segmentação (core dumped)!

Iniciado por Natureba, 07 de Abril de 2007, 13:58

tópico anterior - próximo tópico

Natureba

Alguem poderia me explicar por que acontece esse erro?
Durante meu estudo sobre SDL, depois de compilar um jogo, quando tentava abrí-lo recebia muitas vezes esse erro: Falha de segmentação (core dumped)...

Acontece que já a algum tempo eu estou desenvolvendo um MMORPG com um colega, e nunca tinha tido esse problema, até que nós precisamos fazer menus, e decidimos fazê-los através da GTK... Então eu estudei como embutir uma janela SDL em uma janela GTK, e finalmente consegui fazer o que eu queria, mas na hora de passar isso para o meu jogo o problema:
Falha de segmentação (core dumped)

Alguem ai sabe o que poderia ser, ou me ajudar a consertar isso???

EDIT: Bom se alguem souber me dizer tbm pq eu recebo o erro:
The program 'JOGO' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
  (Details: serial 57 error_code 3 request_code 3 minor_code 0)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)

Quando tento rodar uma aplicação GTK com SDL, eu agradeço, pois no entanto só consigo rodar essas aplicações com o parametro --sync na frente...


Valeu pessoal.
Abraços.

Darcamo

Falha de segmentação pode ter muitas causas. Em geral é quando vc tenta acessar uma região de memória que não devia, tipo tentar acessar um elemento fora de um vetor, tentar deletar um objeto usando um ponteiro inválido (o objeto já foi deletado, por exemplo), etc, etc, etc..

Vc não está chamando nenhuma função da GTK antes de inicializar ela?

Normalmente eu descubro a causa desse tipo de erro assim (usando o kdevelop):
Rodo o programa no modo debug. Não precisa colocar nenhum breakpoint.
O programa deve rodar até a parte do erro e aparece uma janela indicando o erro de segmentation falt.
Depois disso o o programa vai estar parado, mas ainda no debug (se eu mandar seguir um passo o programa acaba e sai). Aí vou na aba do "Frame Stack" e saio clicando de um em um. Com isso descubro em que parte do programa o erro ocorreu e então decido o que fazer daí em diante.

Ps: vc poderia me dizer como embutir uma janela da SDL dentro de uma janela GTK? Se for GTKmm melhor ainda, já que mexi com a GTKmm e não com a GTK propriamente dita.  ;D

Natureba

Então cara... Eu to a quase 1 semana tentando fazer isso e ontem consegui fazer com que a janela da SDL aparecesse no GTK... eu fiz mais ou menos assim:

Dentro do main eu inicializei a janela GTK e setei algumas coisas para ela, como o sinal de delete_event, nome da janela e etc...
ai eu inclui o código:
/* Hackeia para conseguir que o SDL use a janela GTK window */
   { char SDL_windowhack[32];
      sprintf(SDL_windowhack,"SDL_WINDOWID=%ld",
         GDK_WINDOW_XWINDOW(janela->window)); // onde janela é a janela criada em GTK
      putenv(SDL_windowhack);
   }
e depois:
gtk_widget_show_all(janela); // onde janela é a janela criada em GTK
g_timeout_add(22,loop, janela); //que chama o laço principal (loop) de tanto em tanto tempo,
e depois ao invés de usar SDL_Flip como deveria eu usava SDL_UpdateRect....

Bom não sei se deu pra entender, mas pega o código do jogo BATALHÃO que ele é feito em SDL e GTK e eu me baseei nele para descobrir como fazer isso...xD o site do batalhao ateh ontem era: http://batalhao.codigolivre.org.br/ , mas agora nao estou conseguindo acessar... se quiser o fonte eu te mando...

Espero ter ajudado...
Valeu.
Abraços.

Natureba

E quanto ao erro:

The program 'JOGO' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
  (Details: serial 57 error_code 3 request_code 3 minor_code 0)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)

Alguem sabe o que pode ser???

Abraços.

Darcamo


Natureba

multithread??? sei la... como eu faço isso???

Valeu.
Abraços.

Darcamo

Citarmultithread??? sei la... como eu faço isso???
hehehe

Multithread basicamente é para poder rodar mais de uma parte do programa ao mesmo tempo (cada parte em sua própria thread, mas ainda dentro do mesmo processo).
É essencial quando se usa interface gráfica e vc precisa chamar alguma função demorada. Sem usar multithread se um callback for demorado, a interface gráfica não vai ser atualizada até que o callback termine e dá a impressão de que o programa travou.

Mas multithread é algo que tem que ser usado com cautela e planejamento. Como vi "asynchronously" pensei que talvez você tivesse usando, mas me enganei.


De qualquer forma, voltando ao assunto do tópico, vi na internet que alguém teve um problema parecido ao usar GTK e SDL (esse mesmo hack era usado). Não vi a solução, mas ao menos da pra dizer que o problema está nessa integração. Será que vc num tá tentando jogar algo na janela da SDL antes de inicializar a GTK?

Natureba

cara, eu acho que nao... pq eu consigo rodar o jogo com parametro --sync,e  no windows tambem roda normal...

Darcamo

Ok então.

Se bem que não entendo como depois de tanto tempo ainda é necessário usar esse hack para usar uma janela da SDL dentro de uma da GTK. Seria muito bom se a GTK tivesse uma widget para isso.