Как точно определить, куда долгая функция возвращается

Риск Вашего трафика, сниффингового на узле между Вашим ISP и местом назначения, является удаленным. Вы были бы один среди миллионов, и это берет нетривиальное количество вычислительной мощности на том уровне для выполнения проверки пакетов для идентификации пакетов, несущих данные для входа.

реальный риск в локальной сети, как на это указали. 2 наиболее распространенных сценария:

  1. зараженный пользователь компьютера или злонамеренный пользователь используют приемы как отравление ARP для сниффинга всего незашифрованного трафика. Отравление ARP довольно непримечательно в сетях низкого трафика. В сетях интенсивного трафика это вызовет значимое снижение производительности и вероятность увеличений обнаружения. Эффективность ARP, отравляющего, возможно, уменьшенный прилежным сетевым разделением.

  2. Кто-то имеет контроль над шлюзом. Это - вероятно, худший сценарий, поскольку весь интернет-трафик проходит через шлюз. В зависимости от того, насколько умный взломщик, это может быть очень трудно обнаружить.

SSL принимает меры против сниффинга, и он имеет другое преимущество, о котором Вы не могли бы знать: SSL позволяет Вам быть уверенным, что объект, получающий Ваши пароли и другие детали, - то, кто Вы думаете, что это.

, Если говорят, Вы были жертвой отравления DNS, где кто-то перенаправляет Вас на злонамеренный сайт, который точно походит на законный веб-сайт, у Вас не было бы способа знать. С SSL Вы получили бы предупреждение/ошибку, что сайт не имеет действительного сертификата, который предупредил бы Вас, что все не, как это должно быть.

Лично я адаптирую свои пароли в соответствии с тем, перемещается ли информация по HTTPS. Я делаю это, потому что неизбежно, что в конечном счете мне будет нужен вход в систему по HTTP в небезопасной сети.

5
задан Baiyan Huang 22 August 2009 в 02:58
поделиться

9 ответов

Очевидно, вам следует реорганизовать эту функцию, но в C ++ вы можете использовать этот простой прием, чтобы справиться с этим за пять минут:

class ReturnMarker
{
   public:
   ReturnMarker()  {};
   ~ReturnMarker() 
   {
      dummy += 1; //<-- put your breakpoint here
   }
   static int dummy;
}

int ReturnMarker::dummy = 0;

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

void LongFunction()
{
    ReturnMarker foo;

    // ...
}
13
ответ дан 18 December 2019 в 05:49
поделиться

Похоже, пора реорганизовать LongFunction () ...

Функция 1000 строк - плохой запах кода. Потратьте время на его рефакторинг в более мелкие, более удобные в обслуживании функции. Вы обнаружите ошибку (-ы), пока будете исправлены, и это будет выгодным вложением в будущее.

8
ответ дан 18 December 2019 в 05:49
поделиться

Это C или C ++?

Если C ++, создайте новый класс, который обертывает bool (например, CMyBool), с автоматическим преобразованием в bool.

Теперь LongFunction возвращает CMyBool (быстрый поиск и замена изменят все возвращаемые значения в LongFuntion на «return CMyBool (x)».

Теперь установите точку останова в ctor для CMyBool, отладчик теперь остановится при создании CMyBool, который будет на правильный оператор return в LongFunction.

Автоматическое приведение к типу bool не позволит CMyBool нарушить код, использующий CMyBool.

Это решит исходную проблему, но более серьезная проблема заключается в том, что LongFunction необходимо реорганизовать.

12122] Надеюсь, это поможет.

4
ответ дан 18 December 2019 в 05:49
поделиться

Может помочь разделение слоев. Часто настройка машины для работы с БД довольно специфична, так что это разумное первое усилие.

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

Вы можете учесть два момента:

  1. Можете ли вы принять подход «хранилища данных»? Обеспечьте подачу второй БД из первой. Новая БД - это место, где тяжелые пользователи делают свою работу. Конечно, их статистика будет немного устаревшей, но концептуально это всегда будет правдой - к тому времени, как они посмотрят на ответы, мир переместится.
  2. Контролируйте количество запросов статистики, которые вы разрешаете в любой момент. Возможно, они будут отправлены в очередь как «задание».
4
ответ дан 18 December 2019 в 05:49
поделиться

Вы не сказали, на какой платформе вы находитесь. В зависимости от содержимого LongFunction я бы подошел к этому с помощью gdb:

Предположим, что ваш файл 'f.cc' содержит следующие строки:

1: bool LongFunction () {  /* ... */ }
2:
3: void bar ()
4: {
5:   bool bSuccess = LongFunction ();
6:   assert (bSuccess);
7: }

Вот шаги в gdb:

  1. Добавить точку останова в той же строке, что и утверждение: break f.cc:6

  2. Добавить условие к этой точке останова, когда bSuccess ложно: условие 1 (bSuccess == 0 )

  3. Запускайте вашу программу до тех пор, пока не будет достигнута эта точка останова.

  4. Установите точку останова в начале тела функции: break f.cc:4[1220estive Перейти обратно в это место (и он остановится в точка останова): jump f.cc:4

  5. Удалите содержимое LongFunction, чтобы понять, почему он не работает.

Причина, по которой я говорю, что это зависит от содержимого LongFunction, заключается в том, что если LongFunction считывает ввод из потока или изменяет глобальные переменные и т.д., то его поведение во второй раз может быть другим. Вы должны рассматривать вышеупомянутые шаги как такие же, как если бы код был:

3: void bar ()
4: {
5:   bool bSuccess = LongFunction ();
5:   bSuccess = LongFunction ();
6:   assert (bSuccess);
7: }
0
ответ дан 18 December 2019 в 05:49
поделиться

В Visual Studio я бы поставил точку останова на утверждение, затем, используя окно трассировки стека, щелкните следующую строку вверх, и вы попадете в точку выхода метода.

0
ответ дан 18 December 2019 в 05:49
поделиться
#define return { TRACE(LINE); return; }

Это решает вашу проблему 4.

Что касается остального, то это просто проблема с кодированием. Вот почему многие системы возвращают более сложные ошибки (такие как HRESULT от COM-объекта) и / или спамят что-то в потоке отладки при возникновении проблемы.

Тем не менее, функция 1000 строк должна быть отражена. Как вы видите, длинная функция оказывается невероятно сложной в обслуживании.

Изменить: Будет ли следующее работать лучше, чем приведенное выше?

#define return TRACE(LINE), return

Вы выпили несколько напитков, так что это вполне может не быть.

0
ответ дан 18 December 2019 в 05:49
поделиться

«Я, наверное, мог бы отлаживать его шаг за шагом, это работает, но требует много времени, мы этого не делаем» не зная ТОЧНО, что функция делает и должна делать.

И как вы собираетесь это сделать, не переходя через функцию? Я думал, что для этого нужна IDE с хорошим отладчиком.

Откровенно говоря, я нахожу этот вопрос почти юмористическим в очень грустной форме.

не зная ТОЧНО, что функция делает и должна делать.

И как вы собираетесь это сделать, не переходя через функцию? Я думал, что для этого нужна IDE с хорошим отладчиком.

Откровенно говоря, я нахожу этот вопрос почти юмористическим в очень грустной форме.

0
ответ дан 18 December 2019 в 05:49
поделиться

В 1982 году мне было поручено исправить неработающую программу блок-схемы. Программа, написанная на машинно-зависимом фортране Harris (сейчас я не помню, была ли она на FORTRAN IV или FORTRAN 77), состояла из основной программы из 1100 строк, подпрограммы из 900 строк и примерно дюжины подпрограмм, каждая из которых была От 10 до 20 строк.

Да, и в программе почти не было пробелов (пустых строк), а комментарии вообще бесполезны.

Мне потребовалось 160 часов - четыре недели, ПОЛНОЕ ВРЕМЯ, с У меня на столе больше НИЧЕГО - разобраться в этом коде, чтобы произвести надлежащий ремонт.

Вы находитесь в похожей ситуации. С вашей стороны потребуются реальные затраты процессорного времени, чтобы разобраться в этом существе с 1000 строками, достаточно хорошо, чтобы понять, что все может пойти не так, и что делать, чтобы это исправить.

вернуть достаточно просто. Для Microsoft AbysmalC ++: найдите каждый экземпляр «return» и добавьте к нему предисловие

«printf (" \ n \ n --- >>> вставка в строке% d \ n \ n ", __LINE __);"

(или аналогичный в вашей системе). Очевидно, вы не можете делать это автоматически; вам нужно будет посмотреть на локальный брекетинг. Затем запустите свой тест и посмотрите, куда он скажет вам смотреть.

Дело в том, что в реальном мире вычислений почти нет реальных подпрограмм, длина которых действительно должна составлять 1000 строк. За почти 40 лет в этой рэкете, как студент и профессионал, я столкнулся ровно с одной рутиной, которая ДОЛЖНА была быть длиннее одной печатной страницы (около 60 строк), и это был особый случай. Всего было около трех страниц.

С другой стороны, я видел МНОГО отработанных модулей, где парень, который написал это, был слишком ленив или слишком некомпетентен, чтобы должным образом разложить его, а программисты были слишком ленивы, слишком некомпетентны или слишком напуганы своим менеджером, чтобы вернуться и реорганизовать его.

Наконец: Учтите, что вероятно, это будет не последний раз, когда кто-то будет работать над этим модулем, и, возможно, это не последний раз, когда ВАМ придется работать над ним. Такие вещи, как правило, являются смолистыми младенцами: прикоснувшись к ним, вы никогда не оторветесь от них. Возможно, вам стоит потратить хотя бы время на рефакторинг и, вполне возможно, переделать / переписать его ОТ SCRATCH и первых принципов.

Учтите, что это, вероятно, будет не последний раз, когда кто-то будет работать над этим модулем, и, возможно, это будет не последний раз, когда ВАМ придется работать над ним. Такие вещи, как правило, являются смолистыми младенцами: прикоснувшись к ним, вы никогда не оторветесь от них. Возможно, вам стоит потратить хотя бы время на рефакторинг и, вполне возможно, переделать / переписать его ОТ SCRATCH и первых принципов.

Учтите, что это, вероятно, будет не последний раз, когда кто-то будет работать над этим модулем, и, возможно, это будет не последний раз, когда ВАМ придется работать над ним. Такие вещи, как правило, являются смолистыми младенцами: прикоснувшись к ним, вы никогда не оторветесь от них. Возможно, вам стоит потратить хотя бы время на рефакторинг и, вполне возможно, переделать / переписать его ОТ SCRATCH и первых принципов.

0
ответ дан 18 December 2019 в 05:49
поделиться