none
Меняется значение переменной RRS feed

  • Вопрос

  • Здравствуйте! Пишу приложение на WPF. При обычном запуске приложения все работает нормально. Опубликовал через ClickOnce и начались проблемы - меняется значение локальной int переменной в процедуре. Добавил месседжбоксы для отладки, перестала менятся, убрал их - опять меняется. Пока сделал переменную типа old_id в которую записываю значение переменной и потом его использую. Меняется на магическое значение 19200.
    public static MyClass Add(int id)
     {
      int old_id = id;
      ...
      MyClass obj1= Proc1(id, out path);  
      if (obj1!= null)
      {//вот тут уже меняется, но только при ClickOnce
      ...
      }
      return obj1;
     }
    

    3 августа 2011 г. 22:55

Ответы

  • Напоминает обычный баг в коде, а не скрытый, до сих пор необрануженный баг в dataset. Что-нибудь типа использования одного и того же датасета (или DataRow) для разных записей в истории.

    Вернул все как было - это не способ воспроизвести проблему. Если баг был на определенной ревизии в коде - то нужно забрать ее из сорсконтроля, запустить и отладить. Если баг воспроизводится у пользователя - то нужно забрать его бинарники, и отладить их. А не гадать, и не предполагать что переменные типа int меняются сами по себе.


    My blog | My Favorite Project
    • Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 8:25
    8 августа 2011 г. 10:48
  • Так в чем проблема? Возьми студию, прицепиcь через Debug/Attach To Process, и отладь. Или впиши Debugger.Attach()/Break() в нужных местах. Иначе вообще никаких доказательств что именно переменная поменялась, а не запись в xml глючит, нет. Отладка messagebox-ами - это не слишком современный способ.

    Ничего особенного установка через ClickOnce не делает - просто копирует файлы, как есть. Скорее всего проблема в записи в историю. Например, пишешь через промежуточный файл, перезаписать который у clickonce-версии не хватает прав. Ощибку глушишь, а потом дописываешь его к общей истории. Или работаешь с XML через XmlDocument и где-то случайно клонируешь ноды. Да все что угодно - если воспроизводится на машине разработчика - подлежит непосредственной отладке.

    Самоменяющиеся переменные я видел, но сделал их этого правильные выводы и срочно поменял память по гарантии :)


    My blog | My Favorite Project
    • Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 8:25
    5 августа 2011 г. 22:52

Все ответы

  • Какая переменная меняется? Id?
    Что делает функция
    Proc1(id, out path); ?

    4 августа 2011 г. 3:48
    Модератор
  • Меняется Id. В Proc1 ничего такого и даже если бы было, это не должно менять значение здесь.

    private static MyClass Proc1(int id, out string path)
        {
          MyForm form = new MyForm();
          if (form.ShowDialog() == true)
          {
            ..
            _MANAGERS.Add(id, form.Result);
            path = form.Path;
          }
          path = "";
          return null;
        }
    


    4 августа 2011 г. 10:03
  • Дело в том, что Proc1 всегда возвращает null, поэтому в то место, в котором вы говорите, что id меняется программа никогда не заходит.
    if (obj1!= null)
     {//вот тут уже меняется, но только при ClickOnce
    С чего вы взяли, что там id имеет другое значение?

    4 августа 2011 г. 10:12
    Модератор
  • Извините, стер чуток больше.
    private static MyClass Proc1(int id, out string path)
      {
       MyForm form = new MyForm();
       if (form.ShowDialog() == true)
       {
        ..
        _MANAGERS.Add(id, form.Result);
        path = form.Path;
        return form.Result;
       }
       path = "";
       return null;
      }

    Код рабочий, и при обычном выполнении все работает как часы. Но при запуске через ClickOnce появились вот такие проблемы.
    4 августа 2011 г. 12:08
  • 1. Многопоточность есть в программе?

    2. "Работает как часы" в Debug'е или Release'е?

    3. Через ClickOnce устанавливаешь на этот же компьютер или другой?

    4. Приложение консольное? Почему все функции static'ческие?

     

     

    4 августа 2011 г. 18:32
    Модератор
  • 1. Многопоточности нет.

    2. Проверял и в debug и в release, работает все равно.

    3. Не работает на этом же компьюетере и еще на одном.

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

    4 августа 2011 г. 19:05
  • 1. Функция Add в каком классе находится?

    2. Можешь сравнить экзешник который получается при компиляции и тот который публикуется?

    5 августа 2011 г. 5:07
    Модератор
  • В выполняемом коде между старым id и новым есть где-нибудь вообще изменение этого id? Или переменная используется везде только для чтения?

    Может попробовать найти число 19200 в исходниках, в таком или hex виде.

    Что если попробовать изменить имя параметра фунции Add c id на какой-нибудь id_test.

    public static MyClass Add(int id_test)
    {
    //...
    

    Для связи [mail]
    5 августа 2011 г. 7:05
  • 1. Вся работа с Id в одном классе. Выделили один класс статический с общими методами для всей программы. Везде переменная используется только для чтения. Поискал значение по решению - ничего нет.

    2. Как сравнить экзешники?

    3. Убрал свое old_id, сделал id_test и как не странно, но проблемы нет.

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

    5 августа 2011 г. 11:15
  • Откуда вообще известно что id меняется, если отладка была только messagebox-ами?

    Ставлю на многопоточность :) Метод вызывается по таймеру (хотя бы косвенно)? Добавление блокировки помогает? Переименование переменной помогло - может быть в классе есть поле с тем же именем, но киррилической о?


    My blog | My Favorite Project
    5 августа 2011 г. 17:21
  • Описываю задачу подробнее - пишется торрент клиент на основе monotorrent. По нажатию на кнопку пользователь выбирает раздачу, которую хочет скачать, соответственно в метод передается id раздачи. Производится добавление в движок моноторрента и в историю закачек - xml-файл, чтобы после перезапуска можно было все восстановить. Так вот, при обычном запуске каждая раздача в историю добавлялась со своим уникальным id, после ClickOnce все раздачи стали добавляться с id=19200.

    Блокировку не пробывал, других переменных нет.

    5 августа 2011 г. 17:47
  • Так в чем проблема? Возьми студию, прицепиcь через Debug/Attach To Process, и отладь. Или впиши Debugger.Attach()/Break() в нужных местах. Иначе вообще никаких доказательств что именно переменная поменялась, а не запись в xml глючит, нет. Отладка messagebox-ами - это не слишком современный способ.

    Ничего особенного установка через ClickOnce не делает - просто копирует файлы, как есть. Скорее всего проблема в записи в историю. Например, пишешь через промежуточный файл, перезаписать который у clickonce-версии не хватает прав. Ощибку глушишь, а потом дописываешь его к общей истории. Или работаешь с XML через XmlDocument и где-то случайно клонируешь ноды. Да все что угодно - если воспроизводится на машине разработчика - подлежит непосредственной отладке.

    Самоменяющиеся переменные я видел, но сделал их этого правильные выводы и срочно поменял память по гарантии :)


    My blog | My Favorite Project
    • Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 8:25
    5 августа 2011 г. 22:52
  • Пишу без всяких промежуточных файлов, через DataSet.WriteXml. Самое веселое то, что вернул все как было в этом месте, а проблемы нет. Айди точно менялся, у всех раздач 19200, причем с сервера приходил нормальный ( проверил несколько раз), взял файл истории у одного пользователя, когда была проблема - у него тоже везде 19200. Менял код в других местах, и дизайн не много. У меня ощущение, что это как-то влияет. Напоминает забавную историю http://habrahabr.ru/blogs/windows/103903/
    7 августа 2011 г. 22:53
  • Напоминает обычный баг в коде, а не скрытый, до сих пор необрануженный баг в dataset. Что-нибудь типа использования одного и того же датасета (или DataRow) для разных записей в истории.

    Вернул все как было - это не способ воспроизвести проблему. Если баг был на определенной ревизии в коде - то нужно забрать ее из сорсконтроля, запустить и отладить. Если баг воспроизводится у пользователя - то нужно забрать его бинарники, и отладить их. А не гадать, и не предполагать что переменные типа int меняются сами по себе.


    My blog | My Favorite Project
    • Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 8:25
    8 августа 2011 г. 10:48