Получение "Ошибка проверки времени выполнения # 0; Когда вызывается obj -> X (); вызывается некоторая другая функция Y (), которая даже не является частью solutn - PullRequest
1 голос
/ 24 марта 2012

Привет, я получаю ошибку времени выполнения:

" Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции. Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах, с указателем на функцию, объявленным с другим соглашение о вызовах."

Я знаю, что в stackoverflow уже есть вопрос по той же теме.

Но я сомневаюсь, что здесь подразумевается под «ESP».

В моем коде: я вызываю функцию X () следующим образом:

obj -> X();

Но я наблюдаю в стеке вызовов, что какая-то другая функция Y (), которая НЕ ДАЖЕ часть текущего решения вызывается !!!! (Я сделал F11 на операторе «obj -> X ();» и контроль идет внутри Y (), и этот Y () даже не является частью моего текущего решения !!!!!!!!

Это так странно, что когда я вызываю X (), вызывается какая-то другая функция Y () (даже не часть текущего решения).

Может ли кто-нибудь любезно помочь мне в этом ...
К вашему сведению, я использую VS2008.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

«ESP» - указатель стека.

Грубо говоря, после вызова функции указатель стека должен быть таким же, как и раньше.Проверка выполнения во время выполнения показывает, что это не так.

Это симптом . причина обычно где-то еще, скорее всего в вашем коде, который выполнялся раньше.

Обратите внимание, что после повреждения ESP информация, представленная в вашем стеке вызовов, больше не является надежной.Так что Y () может быть просто еще один симптом.(есть и другие возможные причины, я бы пока игнорировал этот факт.)

Распространенные / возможные причины повреждения указателя стека:

  • вы вызываете функцию сдругое соглашение о вызовах, чем оно реализовано

    • Вы вызываете функцию через указатель на функцию, и вам нужно в какой-то момент принудительно вызвать приведение, чтобы она скомпилировалась?
    • вы?Вызывая метод во внешней DLL?
    • Вы по-другому балуетесь соглашениями о вызовах (cdecl, stdcall и т. д.?)таблица методов (VMT) объекта, вызывающая другой, но все же "разумный" код
      • является виртуальным X ()?
      • может быть вызвано доступом вне диапазона, который перезаписывает VMTхотя это вряд ли приведет к этим признакам
      • проверка правильности порядка инициализации (например, инициализация ссылки на базовый класс с помощью производного члена класса, вызов виртуальных методов в consТруктор, все в таком духе.)
1 голос
/ 24 марта 2012

Ну, так как ESP является указателем стека, ожидается странное поведение.

Сбои во время выполнения трудно отладить.Они могут быть вызваны повреждением памяти, неудачной или неполной компиляцией / компоновкой, кодом, приводящим к неопределенному поведению, невозможностью возврата из функции, которая объявляет тип возврата и т. Д.код в режиме дизассемблирования.Это может дать вам подсказку.

...