gdb сообщает о неправильных значениях в простой программе. Почему?

#c #gdb

#c #gdb #c

Вопрос:

 #include <iostream>
int main ()
{
  int* a = new int[15];
  a[0] = 42;
  a[1] = 43;
  std::cerr << a[0];

  return 0;
}
  

gdb говорит a = 0xffffffff, а ‘print a[0]’ выдает ‘не удается получить доступ к адресу памяти’, но почему? При запуске за пределами gdb программа выводит ’42’, как и ожидалось. Что здесь вообще происходит? Скомпилирован с помощью ‘g test2.cpp -gstabs -O0 -o тест2’.

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

1. Вы уверены, что не пытаетесь получить доступ a перед new вызовом?

Ответ №1:

На какой платформе вы находитесь? Формат gstabs debugger поддерживается не повсеместно, если вы хотите его использовать, вы должны ознакомиться с интересными различиями между COFF, DWARF 2 и, возможно, некоторыми другими форматами exe / debug, о которых я никогда не слышал. Итог — прочитайте руководство по gdb. Но ваш код почти наверняка будет работать правильно, если вы просто используете флаг -g .

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

1. Я начал использовать stabs несколько лет назад, когда у меня возникли проблемы с отладкой программы на c . Я перепробовал все форматы и stabs был единственным, который работал правильно в то время. С тех пор я придерживаюсь этого, и это первая проблема, с которой я столкнулся.

Ответ №2:

Да, я могу воспроизвести это, но только с -gstabs

Итак: почему вы используете -gstabs ?

Звучит нечестно, но это честный вопрос, какое преимущество stabs дает «обычной» отладочной информации?