İş parçacıklarında hata ayıklamaya yönelik İpuçları

Bu makale, yerel ve yönetilen kod için iş parçacığı adlarını ayarlama hakkında bilgiler de dahil olmak üzere iş parçacıklarında hata ayıklamaya yönelik yararlı bilgiler sağlar.

C/C++ ipuçları

Yerel kodda iş parçacıklarında hata ayıklarken kullanabileceğiniz bazı ipuçları şunlardır:

  • İzleme penceresine veya QuickWatch iletişim kutusuna yazarak @TIB İş Parçacığı Bilgi Bloğu'nun içeriğini görüntüleyebilirsiniz.

  • İzleme penceresine veya QuickWatch iletişim kutusuna girerek @Err geçerli iş parçacığının son hata kodunu görüntüleyebilirsiniz.

  • C Çalışma Zamanı Kitaplıkları (CRT) işlevleri, çok iş parçacıklı bir uygulamada hata ayıklamak için yararlı olabilir. Daha fazla bilgi için bkz . _malloc_dbg.

C/C++ dilinde iş parçacığı adı ayarlama

İş parçacığı adlandırma, Visual Studio'nun herhangi bir sürümünde mümkündür. İş parçacığı adlandırma, çalışan bir işlemde hata ayıklarken İş Parçacıkları penceresindeki ilgi çekici iş parçacıklarını tanımlamak için kullanışlıdır. Tanınabilir adlandırılmış iş parçacıklarına sahip olmak, kilitlenme dökümü incelemesi aracılığıyla ve çeşitli araçları kullanarak performans yakalamalarını analiz ederken mortem sonrası hata ayıklaması yaparken de yararlı olabilir.

İş parçacığı adı ayarlama yolları

İş parçacığı adı ayarlamanın iki yolu vardır. İlki SetThreadDescription işlevi aracılığıyla yapılır. İkincisi, Visual Studio hata ayıklayıcısı işleme eklenirken belirli bir özel durum oluşturarak yapılır. Her yaklaşımın avantajları ve uyarıları vardır. kullanımı SetThreadDescription Windows 10 sürüm 1607 veya Windows Server 2016'dan itibaren desteklenir.

her iki yaklaşımın da birlikte kullanılabileceğini belirtmek gerekir, çünkü istenirse, çalıştıkları mekanizmalar birbirinden bağımsızdır.

kullanarak iş parçacığı adı ayarlama SetThreadDescription

Avantajlar:

  • Hata ayıklayıcının SetThreadDescription çağrılırken işleme eklenip eklenmediğine bakılmaksızın, Visual Studio'da hata ayıklarken iş parçacığı adları görünür.
  • İş parçacığı adları, Visual Studio'da kilitlenme dökümü yüklenerek son hata ayıklaması yapılırken görünür.
  • WinDbg hata ayıklayıcısı ve Windows Performans Analizi performans çözümleyicisi gibi diğer araçlar kullanılırken iş parçacığı adları da görünür.

Uyarılar:

  • İş parçacığı adları yalnızca Visual Studio 2017 sürüm 15.6 ve sonraki sürümlerde görünür.
  • Kilitlenme dökümü dosyasında hata ayıklama sonrasında iş parçacığı adları yalnızca kilitlenme Windows 10 sürüm 1607, Windows Server 2016 veya sonraki Windows sürümlerinde oluşturulduysa görünür.

Örnek:

#include <windows.h>
#include <processthreadsapi.h>

int main()
{
    HRESULT r;
    r = SetThreadDescription(
        GetCurrentThread(),
        L"ThisIsMyThreadName!"
    );

    return 0;
}

Özel durum oluşturarak iş parçacığı adı ayarlama

Programınızda iş parçacığı adı ayarlamanın bir diğer yolu da, özel olarak yapılandırılmış bir özel durum oluşturarak istenen iş parçacığı adını Visual Studio hata ayıklayıcısına iletmektir.

Avantajlar:

  • Visual Studio'nun tüm sürümlerinde çalışır.

Uyarılar:

  • Yalnızca özel durum tabanlı yöntem kullanıldığında hata ayıklayıcı eklendiğinde çalışır.
  • Bu yöntem kullanılarak ayarlanan iş parçacığı adları dökümlerde veya performans analizi araçlarında kullanılamaz.

Örnek:

SetThreadName Aşağıda gösterilen işlev bu özel durum tabanlı yaklaşımı gösterir. Çağrı tamamlandıktan sonra parametre belleğinin serbest bırakılabilmesi için threadName iş parçacığı adının iş parçacığına SetThreadName otomatik olarak kopyalanacağını unutmayın.

//
// Usage: SetThreadName ((DWORD)-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION = 0x406D1388;
#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
    DWORD dwType; // Must be 0x1000.
    LPCSTR szName; // Pointer to name (in user addr space).
    DWORD dwThreadID; // Thread ID (-1=caller thread).
    DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
void SetThreadName(DWORD dwThreadID, const char* threadName) {
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = threadName;
    info.dwThreadID = dwThreadID;
    info.dwFlags = 0;
#pragma warning(push)
#pragma warning(disable: 6320 6322)
    __try{
        RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
    }
    __except (EXCEPTION_EXECUTE_HANDLER){
    }
#pragma warning(pop)
}

Yerel kodda iş parçacığı adı ayarlama

İş parçacığı adlandırma, Visual Studio'nun herhangi bir sürümünde mümkündür. İş parçacığı adlandırma, İş Parçacıkları penceresinde iş parçacıklarını izlemek için kullanışlıdır.

Yönetilen kodda bir iş parçacığı adı ayarlamak için özelliğini kullanın Name .

Örnek

public class Needle
{
    // This method will be called when the thread is started.
    public void Baz()
    {
        Console.WriteLine("Needle Baz is running on another thread");
    }
}

public void Main()
{
    Console.WriteLine("Thread Simple Sample");
    Needle oNeedle = new Needle();
    // Create a Thread object.
    System.Threading.Thread oThread = new System.Threading.Thread(oNeedle.Baz);
    // Set the Thread name to "MyThread".
    oThread.Name = "MyThread";
    // Starting the thread invokes the ThreadStart delegate
    oThread.Start();
}