Не удается отладить какой-либо код? Странный стек с MSVC?

Иногда у меня сбой приложения со следующей трассировкой стека:

  atiocl.dll!0f6c463a()
  [Frames below may be incorrect and/or missing, no symbols loaded for atiocl.dll]
  atiocl.dll!0f2ed724()
  atiocl.dll!0f2ed82c()
  atiocl.dll!0f2ad8cb()
  OpenCL.dll!000a172c()
  pureStudio.exe!__fseeki64()  + 0xdec0 bytes C++
  pureStudio.exe!__fseeki64()  + 0x9b6f bytes C++
  pureStudio.exe!__fseeki64()  + 0x1f027 bytes C++
  msvcr90d.dll!5af8327f()
  ntdll.dll!77bb041d()
  ntdll.dll!77b79d45()

Это нарушение доступа к памяти! К сожалению, я понятия не имею о проблеме...

Для информации я использую VS 2008 + QT + BOOST + OpenCL

Что странно, так это то, что я знаю, "где" возникает проблема... Мне просто нужно удалить определенную строку кода... и больше никаких ошибок (но софт не делает то, что должен :-P)

Вызов на «мой код», но на этот раз я не вижу своих методов в стеке !!!! (Я могу отслеживать чужой код, другие сбои до...)

Я просто могу показать "разборку", где я вижу свой метод, но не код C++ и контекст!!! Но почему ?

Если у кого-то есть идея помочь мне отладить это?

Спасибо за вашу помощь


person Spectral    schedule 22.02.2011    source источник
comment
Символы отладки для вашего кода? Похоже, у него нет никаких символов, потому что он показывает только адреса для функций...   -  person Tony The Lion    schedule 22.02.2011
comment
Что странно, так это то, что у меня есть символы отладки! Я могу без проблем отслеживать и отлаживать свой код, даже когда я показываю окно модулей, я вижу, что символы загружены! Гм... что-то слишком большое в стеке... возможно... но у меня нет параметра, я много раз запускаю/останавливаю один и тот же поток. Также я выделяю буфер размером 160 байт... много раз... Но перед новым выделением я удаляю предыдущее!   -  person Spectral    schedule 22.02.2011


Ответы (1)


Каждый раз, когда я получал такой стек и удаление кода заставляло его работать, это происходило потому, что я делал... переполнение стека :)

Вполне вероятно, что у вас в стеке что-то слишком большое.

Убедитесь, что у вас нет слишком большого объекта где-то в функции, часто в функции main(). Убедитесь, что большие объекты (менеджеры и тому подобное) всегда размещаются в куче.

person Klaim    schedule 22.02.2011
comment
Вы пытались увидеть, нет ли у вас большого объекта в стеке? Я почти уверен, что это точная проблема, но это из опыта: только вы можете подтвердить или опровергнуть мой ответ... - person Klaim; 22.02.2011
comment
1. посмотрите на код, который заставляет его работать, когда вы его удаляете, посмотрите, может ли один объект, созданный там, но не в куче (без использования new или malloc), иметь большой размер. 2. если ничего не очевидно, попробуйте дихотомический поиск, разделив код на две части и посмотрев, какая часть будет выполняться, пока вы не увидите, какой объект нарушает код. - person Klaim; 22.02.2011
comment
3. если вы не можете найти его, попробуйте убедиться, что объекты небазовых типов размещены в куче (возможно, с помощью интеллектуальных указателей, таких как scoped_ptr), просто чтобы убедиться, что это не проблема. 4. вы также можете просто посмотреть в настройках вашего проекта, каков размер памяти стека, а затем добавить код для отображения в журнале размера каждого типа в ошибочном коде. - person Klaim; 22.02.2011
comment
Я ничего не нашел... Наконец, я думаю, что мой стек поврежден, возможно, из-за неправильной работы с памятью... но как это обнаружить? - person Spectral; 23.02.2011
comment
Я даже тестировал софт с помощью BoundsChecker, но как только он вылетает... уже слишком поздно! Этот инструмент не может найти мою проблему с памятью! На самом деле это сводит меня с ума! - person Spectral; 23.02.2011
comment
Я наконец нашел проблему. Это произошло из-за некоторых нераспределенных !! Я не уверен в причине ... но это звучит исправлено. Спасибо за вашу помощь ;-) - person Spectral; 24.02.2011