2010-07-21 5 views
0

Сценарий: существует иерархия глубоких вызовов, и каждый вызов возвращает HRESULT. Если произойдет что-то плохое, функция вернет S_FALSE или S_ERROR, и если ошибка возврата вызова, вызывающий абонент будет напрямую возвращать код ошибки. обычно вся функция возвращает S_OK. Итак, при отладке проблемы мне нужно сделать много испытаний, посмотрите, какой вызов возвращается! S_OK, и углубитесь и продолжайте ... пока я не найду конечное место, которое вызовет ошибку.Могу ли он установить «точку останова данных» на возвращаемое значение

мне интересно, это может создать «контрольную точку данных» на возвращаемое значение (EAX?) Так, когда возвращаемое значение изменилось или возвращаемое значение равно некоторому значению, программа может остановить ...

ответ

0

Почему бы не просто присвойте возвращаемое значение переменной, установите разрыв в переменной, когда она равна определенному значению (это называется условной точкой останова), и просто верните переменную вместо возвращения S_FALSE/S_ERROR/S_OK и т. д.?

например:

public long yourFunc() { 
    long ret = S_OK; 

    if (someCondition) { 
     ret = S_ERROR; 
    } 
    return ret; // set a conditional breakpoint here, and put in 
       // a condition where ret != S_OK 
} 

EDIT
Если вы не хотите/не можете изменить код, вы можете проверить эту тему: Is it possible to set a conditional breakpoint at the end of a function based on what the function is about to return?

+0

Потому что есть иерархия глубоких вызовов, например, ret = some_other_function(); Если ошибка some_other_function возвращает ошибку, я должен повторить этот процесс еще раз. Если есть рекурсивная функция, связанная с древовидной структурой данных, я должен повторять много раз ... Поэтому я спрашиваю, есть ли что-то вроде точки останова данных при возврате значения :) – superb

+0

Я не понимаю, почему вы должны были бы повторите процесс много раз, если используется рекурсия. Условная точка останова будет срабатывать, как только условие будет выполнено, независимо от того, насколько глубоко вы находились в рекурсивном спуске. В любом случае, если вы не хотите менять свой код, я разместил связанную ссылку в своем редактировании, которая может помочь. Удачи :). – dcp

+0

проблема заключается в том, что в методе он не возвращается в одном месте, многие фрагменты кода выглядят так: hr = some_call (...); if (FAILED (hr)) return hr; Таким образом, условная точка останова не будет работать. Я проверю указанную вами ссылку. – superb

Смежные вопросы