GDB не предоставляет подробностей в segfault cygwin

#c #gdb #cygwin

#c #gdb #cygwin

Вопрос:

Итак, я пытаюсь отладить ошибку segfault в проекте C для школы. Проект использует makefile для компиляции. Когда я запускаю программу под gdb (используя cygwin) Я получаю ошибку segfault, но когда я пытаюсь использовать команду «l» для отображения кода, я получаю код, отличный от ожидаемого, и когда я использую «frame», gdb печатает только имя функции вместо кода, который выполнялся последним.

 Program received signal SIGSEGV, Segmentation fault.
0x000000010041570b in NodeCorrectness::eval(Alignment constamp;) ()
(gdb) l
1       /* advapi32.cc: Win32 replacement functions.
2
3       This file is part of Cygwin.
4
5       This software is a copyrighted work licensed under the terms of the
6       Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
7       details. */
8
9       #include "winsup.h"
10      #include <winioctl.h>
(gdb) frame
#0  0x000000010041570b in NodeCorrectness::eval(Alignment constamp;) ()
(gdb) 
  

Используя обратную трассировку, я получаю следующее:

 (gdb) bt
#0  0x000000000042781b in NodeCorrectness::eval(Alignment constamp;) ()
#1  0x0000000000421a2f in MeasureCombination::printMeasures(Alignment constamp;, std::ostreamamp;) const ()
#2  0x00000000004fbedf in makeReport(Graph constamp;, Graphamp;, Alignment constamp;, MeasureCombination constamp;, Method*, std::basic_ofstream<char, std::char_traits<char> >amp;)
    ()
#3  0x00000000004fe6cd in saveReport(Graph constamp;, Graphamp;, Alignment constamp;, MeasureCombination constamp;, Method*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) ()
#4  0x00000000004d06a7 in NormalMode::run(ArgumentParseramp;) ()
#5  0x000000000040a655 in main ()
(gdb)
  

Таким образом, gdb не позволяет мне увидеть, где именно произошел сбой segfault. Есть ли причина для этого?

Комментарии:

1. Может быть много причин. Может быть, что любая ошибка, ответственная за segfault, также испортила стек до такой степени, что в этом gdb нет смысла.

2. Попробуйте bt выполнить команду, чтобы получить обратную трассировку. Вероятно, это не даст намного больше, но если то, что это дает вам, является полной бессмыслицей, велика вероятность, что стек поврежден. Сужает

3. @Varshavchik вау, я даже не знал, что segfault может испортить стек таким образом.

4. @user4581301 это не было полной бессмыслицей. Я получил трассировку, которая имела смысл.

5. Ошибка segfault не приведет к повреждению стека. Ошибка segfault является результатом того, что стек был испорчен. ХОРОШО, поэтому трассировка имела смысл. Стоит добавить это к вопросу, если вы еще не интерпретировали его и не ответили на свой собственный вопрос.