Print all of the thread's information and stack traces
От: mihhon  
Дата: 08.06.11 14:24
Оценка:
http://www.java2s.com/Tutorial/Java/0120__Development/Printallofthethreadsinformationandstacktraces.htm

есть что-то подобное в c# ? чтоб информацию о всех threads получить

в программке многопоточной как-то непонятно threads то ли засыпают, то ли умирают, то ли блокируются, и непонятные NullReferenceException вылетают в коде типа
void Method() {
  MyClass a = GetA();
  if (a != null) 
  {
    a.field1 = 1; // NullReferenceException здесь
  }
}


не могу понять
Re: Print all of the thread's information and stack traces
От: Sinix  
Дата: 08.06.11 14:49
Оценка: 1 (1)
Здравствуйте, mihhon, Вы писали:

M>в программке многопоточной как-то непонятно threads то ли засыпают, то ли умирают, то ли блокируются, и непонятные NullReferenceException вылетают в коде типа

Если код _точно_ такой, то NullReferenceException взяться неоткуда.

Как вариант, можно сохранить crash dump. Если используется 4й CLR — можно отладить дамп в 2010й студии, если не повезло — WinDbg + SOS. Ссылки:
http://stackoverflow.com/questions/1134048/generating-net-crash-dumps-automatically
http://blogs.msdn.com/b/clrteam/archive/2009/10/15/automatically-capturing-a-dump-when-a-process-crashes.aspx
http://blogs.msdn.com/b/tess/archive/2009/06/16/first-look-at-debugging-net-4-0-dumps-in-visual-studio-2010.aspx
Re[2]: Print all of the thread's information and stack trace
От: mihhon  
Дата: 08.06.11 15:27
Оценка:
M>>в программке многопоточной как-то непонятно threads то ли засыпают, то ли умирают, то ли блокируются, и непонятные NullReferenceException вылетают в коде типа
S>Если код _точно_ такой, то NullReferenceException взяться неоткуда.
он даже ещё более "неоткуда": а используется как ключ в Dictionary и Exception соответствует null ключу при добавлении в Dictionary

S>Как вариант, можно сохранить crash dump. Если используется 4й CLR — можно отладить дамп в 2010й студии, если не повезло — WinDbg + SOS. Ссылки:

S>http://stackoverflow.com/questions/1134048/generating-net-crash-dumps-automatically
S>http://blogs.msdn.com/b/clrteam/archive/2009/10/15/automatically-capturing-a-dump-when-a-process-crashes.aspx
S>http://blogs.msdn.com/b/tess/archive/2009/06/16/first-look-at-debugging-net-4-0-dumps-in-visual-studio-2010.aspx

я почитал про dump, crash нет, но записать dump можно, наверно надо будет dump смотреть, так как это особо много инфо не даёт:

        public static string GetThreadsInfo()
        {
            var sb = new StringBuilder();
            ProcessThreadCollection threads = Process.GetCurrentProcess().Threads;
            foreach(ProcessThread pt in threads)
            {
                sb.Append("\n");
                sb.Append("id=").Append(pt.Id);
                sb.Append(", state=").Append(pt.ThreadState);
                try
                {
                    sb.Append(", waitReason=").Append(pt.WaitReason);    
                }
                catch (Exception)
                {
                    sb.Append(", does not wait");
                }
            }
            return sb.ToString();
        }
Re[3]: Print all of the thread's information and stack trace
От: Sinix  
Дата: 08.06.11 16:02
Оценка:
Здравствуйте, mihhon, Вы писали:

M>он даже ещё более "неоткуда": а используется как ключ в Dictionary и Exception соответствует null ключу при добавлении в Dictionary

Скорее всего проблема не в самом a, а в словарике, что дёргается из нескольких потоков.

M>я почитал про dump, crash нет, но записать dump можно, наверно надо будет dump смотреть, так как это особо много инфо не даёт:

Если вам нужен стэк вызовов для потока — см System.Diagnostics.StackTrace, один из конструкторов принимает thread в качестве параметра. Только чем вам это поможет — , код уже нагадил в тапки и сбежал.
Re: Print all of the thread's information and stack traces
От: cvetkov  
Дата: 08.06.11 16:04
Оценка: :)
этот код упасть не может, показывайте настоящий.
Re[2]: Print all of the thread's information and stack trace
От: mihhon  
Дата: 09.06.11 07:28
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>этот код упасть не может, показывайте настоящий.


        private UCache GetUnderlyingCache()
        {
            if (underlyingCache == null)
            {
                T2 bCache = GetCache();
                
                if (bCache == null)
                {
                    throw new ApplicationException("Unable to resolve the bCache");
                }

                UCache c;
                if (!underlyingCaches.TryGetValue(bCache, out c))
                {
                    c = new UCache(bCache);
                    underlyingCaches[bCache] = c;  // exception here
                }
                underlyingCache = c;
            }
            return underlyingCache;
        }



System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)
   at Xxx.GetUnderlyingCache()...
   ...



может ли такой staktrace означать concurrent access problem в Dictionary ?

хотя вроде этот метод вызывается из threadsafe места ...
Re[3]: Print all of the thread's information and stack trace
От: cvetkov  
Дата: 09.06.11 08:20
Оценка:
интересует тип bCache и тип underlyingCache
Re[4]: Print all of the thread's information and stack trace
От: mihhon  
Дата: 09.06.11 08:45
Оценка:
C>интересует тип bCache и тип underlyingCache
классы с неперегруженными GetHashCode и Equals
Re[5]: Print all of the thread's information and stack trace
От: cvetkov  
Дата: 09.06.11 08:47
Оценка:
underlyingCaches не может менятся на null из другого потока?
Re[6]: Print all of the thread's information and stack trace
От: mihhon  
Дата: 09.06.11 08:55
Оценка:
C>underlyingCaches не может менятся на null из другого потока?
на null нет, меняться может — это бага, я поставил lock
и поэтому спросил ранее про stacktrace, не может ли это быть из-за concurrent access
Re[7]: Print all of the thread's information and stack trace
От: cvetkov  
Дата: 09.06.11 09:03
Оценка:
Здравствуйте, mihhon, Вы писали:

C>>underlyingCaches не может менятся на null из другого потока?

M>на null нет, меняться может — это бага, я поставил lock
M>и поэтому спросил ранее про stacktrace, не может ли это быть из-за concurrent access
а в стектрейсе что написано? GetUnderlyingCache первая строчка?
Re[8]: Print all of the thread's information and stack trace
От: mihhon  
Дата: 09.06.11 09:08
Оценка:
C>>>underlyingCaches не может менятся на null из другого потока?
M>>на null нет, меняться может — это бага, я поставил lock
M>>и поэтому спросил ранее про stacktrace, не может ли это быть из-за concurrent access
C>а в стектрейсе что написано? GetUnderlyingCache первая строчка?

http://rsdn.ru/forum/dotnet/4304096.1.aspx
Автор: mihhon
Дата: 09.06.11

там много строчек, но NullReferenceException уже внутри Dictionary
Re[9]: Print all of the thread's information and stack trace
От: cvetkov  
Дата: 09.06.11 09:20
Оценка:
Здравствуйте, mihhon, Вы писали:

C>>>>underlyingCaches не может менятся на null из другого потока?

M>>>на null нет, меняться может — это бага, я поставил lock
M>>>и поэтому спросил ранее про stacktrace, не может ли это быть из-за concurrent access
C>>а в стектрейсе что написано? GetUnderlyingCache первая строчка?

M>http://rsdn.ru/forum/dotnet/4304096.1.aspx
Автор: mihhon
Дата: 09.06.11

M>там много строчек, но NullReferenceException уже внутри Dictionary

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