Stackdump в C ++ не показывает трассировку стека - PullRequest
1 голос
/ 02 августа 2011

У меня есть приложение, которое иногда дает сбой и создает следующий файл: (APP.exe.stackdump)

Exception: STATUS_ACCESS_VIOLATION at eip=6BA4B246
eax=67452301 ebx=EFCDAB89 ecx=98BADCFE edx=10325476 esi=FFFFFFFF edi=98BADCFE
ebp=FFFFFFFF esp=01A2C928 program=C:\APP.exe, pid 168, thread unknown (0x13E8)
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame     Function  Args
End of stack trace

Я компилирую с g ++ в Windows, Ubuntu и Centos.Ошибка происходит только иногда, внутри потока, в любом случае, чтобы получить трассировку стека, где происходит?Или какая-то дополнительная информация?

Обновление 1:

Я могу захватить это с помощью:

signal(SIGSEGV, sigHandler);

Но все же у меня нет информации о трассировке стека.

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Или какая-нибудь дополнительная информация?

Используйте valgrind или efence. Оба они очень хороши при обнаружении использования диких указателей во время разыменования, а не позже, когда используются поврежденные данные.

1 голос
/ 02 августа 2011

Существует несколько возможностей, по которым трассировка стека недоступна:

  1. вы скомпилировали свой код без стекового фрейма (насколько я помню, это поведение по умолчанию для кода x86_64, сгенерированного gcc / g ++)
  2. вы испортили свой стек (переполнение стека;))
  3. Там нет ничего для отслеживания;) (вы находитесь в коде, выполненном до или после main, и вы еще не ввели какие-либо функции или уже не вернули их)

Судя по факту, что EBP = FFFFFFFF, я бы остановился на # 2, если проблема не существует в коде низкого уровня C или ассемблерном коде, который касается EBP. Можете ли вы обеспечить разборку из свалки?

...