странная проблема в Release
От: _Claus_  
Дата: 31.01.12 12:12
Оценка:
пытаюсь протестировать Release версию своей либы, и получаю неадекватное исключение.

код


 public calc_alloc[T]() : int       
    
      def delta = root.d_new            
      
      root.d_new += Memblock.Create.[T](1).size  //exception: Null Reference                                  
      
      delta



описание Мемblock


public struct Memblock    

    static public delta : int = Marshal.SizeOf(typeof(Memblock))
    
    static public Create[T](count: int) : Memblock
    
      Memblock(count * SizeOf.[T]())
      
    static public Create[T]() : Memblock
    
      Memblock(SizeOf.[T]())
    
    static public SizeOf[T]() : int       
    /*Marshal.Size(char) == 2 for russian letters and 
    generic type has to be calculating*/       
      def type = typeof(T)
      
      if (type.Equals(typeof(char)))
        2
      else 
        if (type.IsGenericType)          
        
          Marshal.SizeOf(default(T))
        else
          Marshal.SizeOf(type)    

    length: int 

    this(len : int)
        
      length = len


в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно.
Debug — все ок. в момент исключения T — чистая структура.
Re: странная проблема в Release
От: CodingUnit Россия  
Дата: 31.01.12 12:15
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>пытаюсь протестировать Release версию своей либы, и получаю неадекватное исключение.


_C_>в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно.

_C_>Debug — все ок. в момент исключения T — чистая структура.

Сделай плиз иссью на гитхабе, со своим примером.
Re: странная проблема в Release
От: _Claus_  
Дата: 31.01.12 12:27
Оценка:
_C_>в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно.
_C_>Debug — все ок. в момент исключения T — чистая структура.

тут оказалось еще хуже — даже в таком варианте Null Reference.


root.d_new += 5//Memblock.Create.[T](1).size

а root у меня — поле в классе с таким описанием

mutable root : InnerDbRoot

а его описание:


 public struct InnerDbRoot
   
    public mutable d_free : int
   
    public mutable d_new : int  
   
    public mutable d_root_obj : int 
   
    public mutable types : int    
   
    public mutable bases : int


и какой тут Null Exception, когда я внутри вызова обычного метода??
Re[2]: странная проблема в Release
От: CodingUnit Россия  
Дата: 31.01.12 12:40
Оценка:
Здравствуйте, _Claus_, Вы писали:


_C_>тут оказалось еще хуже — даже в таком варианте Null Reference.


Ты можешь локализовать проблему, чтобы на примере я мог скомпилировать и посмотреть что происходит в компиляторе? Попробуй изложить это в иссью, я постараюсь посмотреть, вообще проблемы с Release и Debug версиями действительно могут быть, сам недавно видел одну из них, там может сильно меняться обработка компилятора, оптимизации, какие то из них реже проверяются потому что разработчики обычно собирают Debug версию. Так что не удивляйся, а запость свою проблему на гите и в скором времени постараемся исправить.
Re[2]: странная проблема в Release
От: CodingUnit Россия  
Дата: 31.01.12 19:29
Оценка:
Здравствуйте, _Claus_, Вы писали:


_C_>>в общем это структура безо всяких указателей. откуда оно нашло Null Reference — мне сильно непонятно.

_C_>>Debug — все ок. в момент исключения T — чистая структура.

Ты уверен что NRE? Я вижу тут InvalidOperationException и не только в релизе, он появляется когда запускается метод calc_alloc() не заходя внутрь. Пример воспроизводится так:


using Nemerle;
using System.Console;

public struct InnerDbRoot
{
  public mutable d_new : int;
}

public class Dbx
{
  root : InnerDbRoot;

      public calc_alloc() : void
      {
          root.d_new += 5;           
      }

//      public calc_alloc2() : void
//      {
//          root.d_new = 5;           // compilation error
//      }

}

module Test
{
  
  Main() : void
  {
    def d = Dbx();

    d.calc_alloc(); // exception is here
  }
}


Тут дело в обращении к полю, я разбираюсь в чем дело, там что то с генерацией кода, закоментированный метод вообще не компилируется. Точно ты видишь NRE, а не более серьезное исключение? И наверное придется еще одну иссью заводить для закоментированного примера. Похоже у нас всегда были проблемы со структурами, надо их доделывать. А как воркэраунд, ты пока можешь поискать более безопасные способы, типа свойств и классов.
Re[3]: странная проблема в Release
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.12 20:17
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>public struct InnerDbRoot

CU>{
CU> public mutable d_new : int;
CU>}

CU>public class Dbx

CU>{
CU> root : InnerDbRoot;

CU> public calc_alloc() : void

CU> {
CU> root.d_new += 5;
CU> }

При изменении значений полей структур изменяется вся структура целиком. ПО сему поле в которой она находится не может быть неизменяемым.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: странная проблема в Release
От: _Claus_  
Дата: 31.01.12 21:41
Оценка:
VD>При изменении значений полей структур изменяется вся структура целиком. ПО сему поле в которой она находится не может быть неизменяемым.

а по любому не работает — у меня в коде mutable, без разницы
Re[3]: странная проблема в Release
От: _Claus_  
Дата: 01.02.12 00:49
Оценка:
CU>Тут дело в обращении к полю, я разбираюсь в чем дело, там что то с генерацией кода, закоментированный метод вообще не компилируется. Точно ты видишь NRE, а не более серьезное исключение? И наверное придется еще одну иссью заводить для закоментированного примера. Похоже у нас всегда были проблемы со структурами, надо их доделывать.

Создал чистый проект (до этого просто добавлял тест код в рабочий) с описанным примером в Issue.

Для моего примера в Release всегда NRE. root хоть mutable хоть нет.

C твоим вызовом

      public calc_alloc() : void
      {
          root.d_new += 5;           
      }


то же самое. NRE в обоих случаях. использую твой билд с патчем на match.
Re[3]: странная проблема в Release
От: _Claus_  
Дата: 01.02.12 01:29
Оценка:
понял я, что ошибка не в структурах, а в операторах.

если "+= x" заменить на "= delta + x" все нормально.

еще глючный в релизе оператор ::= , с ним тоже развернутая замена "= x :: lst" помогла.
Re[4]: странная проблема в Release
От: CodingUnit Россия  
Дата: 01.02.12 06:39
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, CodingUnit, Вы писали:


VD>При изменении значений полей структур изменяется вся структура целиком. ПО сему поле в которой она находится не может быть неизменяемым.


Почему это работает в C#? Может стоит дать соотв. сообщение об ошибке, а не исключение в рантайме?
Re[4]: странная проблема в Release
От: CodingUnit Россия  
Дата: 01.02.12 06:41
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>понял я, что ошибка не в структурах, а в операторах.


_C_>если "+= x" заменить на "= delta + x" все нормально.


_C_>еще глючный в релизе оператор ::= , с ним тоже развернутая замена "= x :: lst" помогла.


Тут несколько проблем, заведи что увидишь для каждой отдельную иссью, они не должны уходить из внимания.
Re[5]: странная проблема в Release
От: _Claus_  
Дата: 01.02.12 10:40
Оценка:
VD>>При изменении значений полей структур изменяется вся структура целиком. ПО сему поле в которой она находится не может быть неизменяемым.

CU>Почему это работает в C#? Может стоит дать соотв. сообщение об ошибке, а не исключение в рантайме?


структура как цельный объект данных и должна защищаться от изменений def-ом. иначе быть не должно.
Re[5]: странная проблема в Release
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.12 14:15
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Почему это работает в C#? Может стоит дать соотв. сообщение об ошибке, а не исключение в рантайме?


Это не работает в C#. Меняется временная копия и изменения исчезают. По сему делать изменяемые поля в структурах очень опасно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: странная проблема в Release
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.12 14:52
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>понял я, что ошибка не в структурах, а в операторах.

_C_>если "+= x" заменить на "= delta + x" все нормально.
_C_>еще глючный в релизе оператор ::= , с ним тоже развернутая замена "= x :: lst" помогла.

Похоже проблемы с кэшированием в операторах. Странно, так как его еще 4 годна назад делали.

Можешь написать минимальный пример воспроизводящий ошибку?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: странная проблема в Release
От: CodingUnit Россия  
Дата: 01.02.12 17:57
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>структура как цельный объект данных и должна защищаться от изменений def-ом. иначе быть не должно.


Я никак не могу воспроизвести ошибку NRE, у меня на последнем мастере и последнем nighly 468, ошибки возникают так:

Этот код дает InvalidProgramException во время вызова метода в рантайме только в Release, в Debug проходит:

using Nemerle;
using System.Console;

public struct InnerDbRoot
{
  public mutable d_new : int;
}

public class Dbx
{
  mutable root : InnerDbRoot;

      public calc_alloc() : void
      {
          root.d_new += 5;
      }
}

module Test
{
  
  Main() : void
  {
    def d = Dbx();

    d.calc_alloc(); //Exception there InvalidProgramException!
  }
}


Без мутабл root наверное правильно не должно компилироваться, но почему то компилируется и возникает исключение и в Debug и в Release InvalidProgramException в рантайме. Хотя если += заменить на = и оставить mutable, то компилироваться не будет, хотя поведение примерно одно и тоже, все верно, но только не очень неинформативное сообщение. Где то закрались ошибки, надо создать несколько иссью. Попробуй собрать на nightly 468 что ты увидишь? все же у тебя довольно старая версия, там много было поправлено. Если подтвердится моя версия тогда иссью надо будет преобразовать в другую и назвать по другому.
Re[7]: странная проблема в Release
От: _Claus_  
Дата: 01.02.12 19:26
Оценка:
CU> все же у тебя довольно старая версия, там много было поправлено. Если подтвердится моя версия тогда иссью надо будет преобразовать в другую и назвать по другому.

скачал последний 583 билд — свежее не бывает. сбилдил. все на месте. видел NRE своими глазами.. только что.
Re[4]: странная проблема в Release
От: CodingUnit Россия  
Дата: 05.02.12 17:19
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>понял я, что ошибка не в структурах, а в операторах.


Я вроде исправил этот баг #275, у меня сейчас не возникает исключение, попробуй скачать исходники, собери и проверь есть ли исключение в твоих случаях?
Re[5]: странная проблема в Release
От: _Claus_  
Дата: 05.02.12 21:09
Оценка:
CU>Я вроде исправил этот баг #275, у меня сейчас не возникает исключение, попробуй скачать исходники, собери и проверь есть ли исключение в твоих случаях?

При сборке из сырцов имею ошибку. VS2010 SDK стоит. чего может не хватать?

C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\VSSDK\Microsoft.VsSDK.tar
gets(420,5): error : Адресат вызова создал исключение. [C:\MyProjects\nemerle\s
nippets\VS2010\Nemerle.VisualStudio\Nemerle.VisualStudio.csproj]
Построение проекта "C:\MyProjects\nemerle\snippets\VS2010\Nemerle.VisualStudio\
Nemerle.VisualStudio.csproj" завершено (целевые объекты Build) с ошибкой.

Построение проекта "C:\MyProjects\nemerle\NemerleAll.nproj" завершено (целевые
объекты DevBuildQuick) с ошибкой.


Не удалось выполнить построение.

"C:\MyProjects\nemerle\NemerleAll.nproj" (целевой объект DevBuildQuick ) (1) ->
"C:\MyProjects\nemerle\snippets\VS2010\Nemerle.VisualStudio\Nemerle.VisualStudi
o.csproj" (целевой объект Build ) (12) ->
(Целевой объект DeployVsixExtensionFiles) ->
C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\VSSDK\Microsoft.VsSDK.t
argets(420,5): error : Адресат вызова создал исключение. [C:\MyProjects\nemerle
\snippets\VS2010\Nemerle.VisualStudio\Nemerle.VisualStudio.csproj]

Предупреждений: 0
Ошибок: 1
Re[6]: странная проблема в Release
От: CodingUnit Россия  
Дата: 06.02.12 05:46
Оценка:
Здравствуйте, _Claus_, Вы писали:


CU>>Я вроде исправил этот баг #275, у меня сейчас не возникает исключение, попробуй скачать исходники, собери и проверь есть ли исключение в твоих случаях?


_C_>При сборке из сырцов имею ошибку. VS2010 SDK стоит. чего может не хватать?


Там может надо удалить сборку которая была поставлена с инсталлятора, то есть удалить Nemerle с интеграцией через Add/Remove и собрать отдельно через DevBuildQuick4. Но вообще более полные сообщения приводи, тут часть только.
Re[7]: странная проблема в Release
От: _Claus_  
Дата: 06.02.12 15:43
Оценка:
CU>Там может надо удалить сборку которая была поставлена с инсталлятора, то есть удалить Nemerle с интеграцией через Add/Remove и собрать отдельно через DevBuildQuick4. Но вообще более полные сообщения приводи, тут часть только.

Сообщение полное. Удаление установленной интеграции помогло. Патч работает — все ок.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.