나는 segfault와 Traceback이 어떻게 작동하는지 완전히 이해하지 못하지만, 목록 맨 위에 있는 함수가 "glib" 또는 "gobject"를 참조하는 경우 일반적으로 오류(TM)가 없어야 한다는 인상을 받고 있습니다.
글쎄요, 그것이 제가 완전히 다른 두 프로그램에서 얻은 것입니다.
첫 번째는 github.com에서 직접 컴파일한 최신 버전의 irssi입니다(결함이나 오류 없이 깨끗함).
Program received signal SIGSEGV, Segmentation fault.
0xb7cf77ea in g_ascii_strcasecmp () from /usr/lib/libglib-2.0.so.0
(gdb) bt
#0 0xb7cf77ea in g_ascii_strcasecmp () from /usr/lib/libglib-2.0.so.0
#1 0x08103455 in config_node_section_index ()
#2 0x081036b0 in config_node_traverse ()
#3 0x080fb674 in settings_get_bool ()
#4 0x08090bce in command_history_init ()
#5 0x08093d81 in fe_common_core_init ()
#6 0x0805a60d in main ()
제가 문제를 겪고 있는 두 번째 프로그램은 GTK용으로 제작된 NetSurf 웹 브라우저입니다(역시 100% 깔끔하게 컴파일됨)(GTK용으로 제작되지 않은 경우에는 정상적으로 실행됨).
Program received signal SIGSEGV, Segmentation fault.
0xb7c1bace in g_type_check_instance_cast () from /usr/lib/libgobject-2.0.so.0
(gdb) bt
#0 0xb7c1bace in g_type_check_instance_cast () from /usr/lib/libgobject-2.0.so.0
#1 0x080cd31c in nsgtk_scaffolding_set_websearch ()
#2 0x080d05da in nsgtk_new_scaffolding ()
#3 0x080dafd8 in gui_create_browser_window ()
#4 0x0809e806 in browser_window_create ()
#5 0x080c2fa9 in ?? ()
#6 0x0807c09d in main ()
나는 내가 보고 있는 문제가 glib2의 일종의 결함이라고 99.99% 확신합니다. 내 시스템의 나머지 부분은 100% 잘 작동합니다. 단지 이 두 프로그램이 이상한 일을 하고 있을 뿐입니다.
나는 이 라이브러리를 사용하는 다른 프로그램을 만들려고 하면 역시 실패할 가능성이 높다고 믿습니다.
명백히, 작은 실수라도 글리브와 친구를 찌르는 것은 시스템의 거의 모든 프로그램을 치명적으로 충돌시키는 즉각적인 방법입니다(오래 전 다른 시스템에서의 경험을 바탕으로 말씀드립니다 :P).
나는 이런 종류의 일로 내가 무엇을 하고 있는지 전혀 모른다는 점을 감안할 때 거기에 가기를 꺼려합니다. 현재 시스템 구성을 계속 유지하고 싶습니다. :)
컴파일할까 생각 중이야새로운glib2(및 co.) 버전을 설치한 다음 이러한 프로그램을 여기에 정적으로 연결합니다. 무엇을 해야 할지 모르겠습니다. 어떤 조치를 취해야 합니까?
내 다른 아이디어는 ./configure --prefix=/usr; make; make install
현재 내 시스템에 있는 glib의 정확한 버전을 "복원"하고 다시 설치하는 것입니다. 관련 핵심 라이브러리가 모두 "0.3200.4":
-rwxr-xr-x 1 root root 1.4M Aug 9 2012 /usr/lib/libgio-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 1.2M Aug 9 2012 /usr/lib/libglib-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 11K Aug 9 2012 /usr/lib/libgmodule-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 308K Aug 9 2012 /usr/lib/libgobject-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 3.7K Aug 9 2012 /usr/lib/libgthread-2.0.so.0.3200.4
이것이 효과가 있을 수 있습니까, 아니면 심각하게 문제를 일으킬 수 있습니까? :S
작동할 수 있다면 "0.3200.4"는 어떤 버전으로 번역되나요?
또 어떤 아이디어를 시도해 볼 수 있나요?
근본적인 오류가 무엇이든 수정하기 위해 glib 자체에 대한 수정 사항을 반드시 찾고 있는 것은 아닙니다. 이는 나에게 영향을 미치지 않습니다.저것아주 나쁜. irssi와 NetSurf가 올바르게 실행되기를 원합니다.
답변1
내 생각에는 목록 맨 위에 있는 함수가 "glib" 또는 "gobject"를 참조하는 경우 일반적으로 오류가 발생하지 않는 라이브러리에 Bad Issues(TM)가 발생한다는 것입니다.
이것이 해당 라이브러리에 결함이 있을 수 있음을 의미한다면 잘못된 인상을 받게 될 것입니다. 이것이 의미하는 바는 아닙니다. 이전 버그가 발생한 곳이 바로 여기일 가능성이 높습니다. 기본적으로 C에는 런타임 보호 기능이 많지 않으므로 컴파일되지만 추가로 검증되지 않는 인수를 쉽게 전달할 수 있습니다(직접 수행하지 않는 한). 간단한 예:
int main (void) {
char whoops[3] = { 'a', 'b', 'c' };
if (strcmp(whoops, "abcdef")) puts(whoops);
종료되지 않은 문자열을 여러 다른 문자열 함수에 전달합니다. 이는 문제 없이 컴파일되며 대부분 잘 실행될 것입니다.메모리 위반아주 미미하겠지만,할 수 있다strcmp()
또는 puts()
. 이는 strcmp()
구현에 문제가 있다는 의미는 아닙니다 . 오류가 분명히 있습니다 main()
.
이와 같은 함수는 전달된 인수가 적절하게 종료되었는지 논리적으로 확인할 수 없습니다. 이는 WRT 런타임 검사를 의미하는 반면 C에는 "본질적으로" 검사가 부족합니다. 대부분의 경우 데이터가 그렇게 하드코딩되지 않기 때문에 컴파일러가 무엇을 검사해야 하는지 지정하는 것은 별로 의미가 없습니다.
중간에 있는 항목을 역추적하는 것도 가능하지만 반드시 작동하는 것은 아닙니다. 일반적으로 말해서, 살펴보기 시작하는 곳은 다음과 같습니다.마지막입구가 문제야역 추적도착하다.
그러나 오류는 언제나 어디에나 존재할 수 있습니다. 종종 메모리 검사기가 보고한 오류와 역추적을 비교하면 valgrind
범위를 좁히는 데 도움이 될 수 있습니다. WRT 귀하의 예는 아마도 살펴볼 것이 많을 것입니다. 마지막으로 valgrind와 gtk는 행복한 놀이 친구가 아닙니다.
나는 glib2(및 공동)의 새 버전을 컴파일한 다음 이러한 프로그램을 여기에 정적으로 링크할 생각입니다.
할 수는 있지만 그것 때문에 어떤 것이든 더 나아질 것이라고 믿을 이유는 없습니다. 빨대를 쥐고 있는 것입니다. 실제로 문제를 직접 디버깅할 수 없다는 것은 이해할 수 있으므로 무엇을 시도할 수 있는지 필사적으로 궁금해합니다.
아마도 당신은 많은 시간을 낭비하고 좌절감을 느낄 것입니다.
나는 내가 보고 있는 문제가 glib2의 일종의 결함이라고 99.99% 확신합니다.
나는 당신이 이 분야에 대해 과신하고 있다고 99% 확신합니다.
또 다른 버그할 수 있다경험상 가장 광범위하게 테스트된 부품은 가장 가능성이 낮은 범인으로 간주되어야 합니다. 이 경우 glib는 상당히 일반적인 반면 irssi와 NetSurf는 상대적으로 모호합니다.
가장 좋은 방법은 버그 보고서를 제출하는 것입니다. 그곳에서는 역추적(backtracking)이 종종 인기가 있습니다. irssi 및 NetSurf로 시작하면, glib를 직접적으로 말하면 그들은 증명할 수 없는 한(이 중 어느 것도 증명할 수 없는 한) 그것이 자신들의 문제라고 믿을 이유가 없다고 합법적으로 말할 것입니다. 반면에 irsi 사람들이 결정하면예유쾌한 경우에는 스스로 이것을 추구하려는 유혹을 받을 수도 있습니다.