Visual Studio'da Python ve C++ hatalarını birlikte ayıklama

Çoğu normal Python hata ayıklayıcısı yalnızca Python kodunda hata ayıklamayı destekler, ancak geliştiricilerin Python'ı C veya C++ ile kullanması yaygın bir uygulamadır. Karma kod kullanan bazı senaryolar, yüksek performans gerektiren uygulamalardır veya platform API'lerini doğrudan çağırma özelliği genellikle Python ve C veya C++ ile kodlanmıştır.

Visual Studio, Python ve yerel C/C++ kodu için tümleşik, eşzamanlı karma mod hata ayıklaması sağlar. Destek, Visual Studio yükleyicisinde Python Geliştirme iş yükü için Python yerel geliştirme araçları seçeneğini belirlediğinizde kullanılabilir:

Visual Studio Yükleyicisi Python yerel geliştirme araçları seçeneğini gösteren ekran görüntüsü.

Bu makalede, aşağıdaki karma mod hata ayıklama özellikleriyle nasıl çalışabileceğinizi keşfedersiniz:

  • Birleşik çağrı yığınları
  • Python ile yerel kod arasında adım
  • Her iki kod türündeki kesme noktaları
  • Yerel çerçevelerdeki nesnelerin Python gösterimlerini görüntüleme (veya tam tersi)
  • Python projesi veya C++ projesi bağlamında hata ayıklama

Visual Studio'da Python ve C++ kodu için karma mod hata ayıklama örneğini gösteren ekran görüntüsü.

Önkoşullar

  • Visual Studio 2017 ve üzeri. Visual Studio 2015 ve önceki sürümlerde Visual Studio için Python Araçları 1.x ile karma mod hata ayıklama kullanılamaz.

  • Python iş yükleri desteğiyle yüklenen Visual Studio. Daha fazla bilgi için bkz . Visual Studio'da Python desteğini yükleme.

Python projesinde karma mod hata ayıklamayı etkinleştirme

Aşağıdaki adımlarda, Python projesinde karma mod hata ayıklamanın nasıl etkinleştirileceği açıklanmaktadır:

  1. Çözüm Gezgini'da Python projesine sağ tıklayın ve Özellikler'i seçin.

  2. Özellikler bölmesinde Hata Ayıkla sekmesini ve ardından Hata Ayıklama> Yerel kod hata ayıklamayı etkinleştir seçeneğini belirleyin:

    Visual Studio'da Yerel kod hata ayıklamayı etkinleştir özelliğinin nasıl ayarlandığını gösteren ekran görüntüsü.

    Bu seçenek, tüm hata ayıklama oturumları için karma modu etkinleştirir.

    İpucu

    Yerel kod hata ayıklamayı etkinleştirdiğinizde, Program duraklatılmadan ve Devam etmek için herhangi bir tuşa basın istemi gösterilmeden Python çıkış penceresi kapatılabilir. Yerel kod hata ayıklamasını etkinleştirdikten sonra duraklatma ve istem zorlamak için, bağımsız değişkeni Hata Ayıkla sekmesindeki Yorumlayıcı Bağımsız Değişkenlerini Çalıştır>alanına ekleyin-i. Bu bağımsız değişken, kod çalıştırıldıktan sonra Python yorumlayıcısını etkileşimli moda geçirir. Program, pencereyi kapatmak için Ctrl+Z+Enter'ı seçmenizi bekler.

  3. Özellik değişikliklerini kaydetmek için Dosya>Kaydet 'i (veya Ctrl+S) seçin.

  4. Karma mod hata ayıklayıcısını var olan bir işleme eklemek için İşleme Ekleme Hatalarını Ayıkla'yı> seçin. Bir iletişim kutusu açılır.

    1. İşleme Ekle iletişim kutusunda listeden uygun işlemi seçin.

    2. Ekle alanında, Seç seçeneğini kullanarak Kod Türü Seç iletişim kutusunu açın.

    3. Kod Türü Seç iletişim kutusunda Bu kod türlerinde hata ayıkla seçeneğini belirleyin.

    4. Listede Python (yerel) onay kutusunu ve ardından Tamam'ı seçin:

      Visual Studio'da hata ayıklama için Python (yerel) kod türünün nasıl seçildiğini gösteren ekran görüntüsü.

    5. Hata ayıklayıcıyı başlatmak için Ekle'yi seçin.

    Kod türü ayarları kalıcıdır. Karışık mod hata ayıklamasını devre dışı bırakmak ve daha sonra farklı bir işleme eklemek istiyorsanız Python (yerel) kod türü onay kutusunu temizleyin ve Yerel kod türü onay kutusunu seçin.

    Yerel seçeneğine ek olarak veya yerine diğer kod türlerini seçebilirsiniz. Örneğin, yönetilen bir uygulama CPython barındırıyorsa ve bu durumda yerel uzantı modüllerini kullanıyorsa ve üç kod projesinde de hata ayıklamak istiyorsanız Python, Yerel ve Yönetilen onay kutularını seçin. Bu yaklaşım, birleşik çağrı yığınları ve üç çalışma zamanı arasında adımlama gibi birleşik bir hata ayıklama deneyimi sunar.

Sanal ortamlarla çalışma

Sanal ortamlar (venvs) için bu karma mod hata ayıklama yöntemini kullandığınızda, Windows için Python, Visual Studio'nun bulduğu ve alt işlem olarak yüklediği venv'ler için bir python.exe saplama dosyası kullanır.

  • Python 3.8 ve üzeri için karma mod çok işlemli hata ayıklamayı desteklemez. Hata ayıklama oturumunu başlattığınızda, saplama alt işlemi uygulama yerine hata ayıklanır. Ekleme senaryoları için geçici çözüm, doğru python.exe dosyaya eklemektir. Uygulamayı hata ayıklama ile başlattığınızda (F5 klavye kısayolu gibi), komutunu C:\Python310-64\python.exe -m venv venv --symlinkskullanarak venv'nizi oluşturabilirsiniz. komutunda tercih ettiğiniz Python sürümünü ekleyin. Varsayılan olarak, Windows'da yalnızca yöneticiler ortak bağlantılar oluşturabilir.

  • 3.8'den önceki Python sürümlerinde karma mod hata ayıklaması venv'lerde beklendiği gibi çalışmalıdır.

Genel bir ortamda çalıştırmak, Python'ın herhangi bir sürümünde bu sorunlara neden olmaz.

Python simgelerini yükleme

Karışık modda hata ayıklamaya ilk kez başladığınızda, Python Simgeleri Gerekli iletişim kutusunu görebilirsiniz. Belirli bir Python ortamı için simgeleri yalnızca bir kez yüklemeniz gerekir. python desteğini Visual Studio Yükleyicisi (Visual Studio 2017 ve üzeri) aracılığıyla yüklerseniz simgeler otomatik olarak eklenir. Daha fazla bilgi için bkz . Visual Studio'da Python yorumlayıcıları için hata ayıklama simgeleri yükleme.

Python kaynak koduna erişme

Hata ayıklama sırasında standart Python'ın kaynak kodunun kullanılabilir olmasını sağlayabilirsiniz.

  1. Şuraya git: https://www.python.org/downloads/source/.

  2. Sürümünüz için uygun Python kaynak kodu arşivini indirin ve kodu bir klasöre ayıklayın.

  3. Visual Studio Python kaynak kodunun konumunu sorarsa, ayıklama klasöründeki belirli dosyaların üzerine gelin.

C/C++ projesinde karma mod hata ayıklamayı etkinleştirme

Visual Studio 2017 sürüm 15.5 ve üzeri bir C/C++ projesinden karma mod hata ayıklamayı destekler. Bu kullanıma örnek olarak python'ı python.org açıklandığı gibi başka bir uygulamaya eklemek isteyebilirsiniz.

Aşağıdaki adımlarda, bir C/C++ projesi için karma mod hata ayıklamanın nasıl etkinleştirileceği açıklanmaktadır:

  1. Çözüm Gezgini C/C++ projesine sağ tıklayın ve Özellikler'i seçin.

  2. Özellik Sayfaları bölmesinde Yapılandırma Özellikleri>Hata Ayıklama sekmesini seçin.

  3. Hata Ayıklayıcısı'nın başlatıldığı açılır menüyü genişletin ve Python/Yerel Hata Ayıklama'ya tıklayın.

    Visual Studio'da bir C/C++ projesi için Python Yerel Hata Ayıklama seçeneğinin nasıl seçildiğini gösteren ekran görüntüsü.

    Not

    Python/Yerel Hata Ayıklama seçeneğini görmüyorsanız, önce Visual Studio Yükleyicisi kullanarak Python yerel geliştirme araçlarını yüklemeniz gerekir. Yerel hata ayıklama seçeneği Python geliştirme iş yükü altında kullanılabilir. Daha fazla bilgi için bkz . Visual Studio'da Python desteğini yükleme.

  4. Değişiklikleri kaydetmek için Tamam'ı seçin.

Program başlatıcıda hata ayıklama

Bu yöntemi kullandığınızda, bir alt python.exe alt işlem oluşturacağından program başlatıcıda py.exe hata ayıklayamazsınız. Hata ayıklayıcı alt işleme eklenmemiştir. Bu senaryo için geçici çözüm, programı aşağıdaki gibi bağımsız değişkenlerle doğrudan başlatmaktır python.exe :

  1. C/C++ projesinin Özellik Sayfaları bölmesinde Yapılandırma Özellikleri>Hata Ayıklama sekmesine gidin.

  2. Komut seçeneği için program dosyasının tam yolunu python.exe belirtin.

  3. Komut Bağımsız Değişkenleri alanında istediğiniz bağımsız değişkenleri belirtin.

Karma mod hata ayıklayıcısını ekleme

Visual Studio 2017 sürüm 15.4 ve önceki sürümlerde, doğrudan karma mod hata ayıklaması yalnızca Visual Studio'da bir Python projesi başlatılırken etkinleştirilir. C/C++ projeleri yalnızca yerel hata ayıklayıcıyı kullandığından destek sınırlıdır.

Bu senaryo için geçici çözüm, hata ayıklayıcıyı ayrı olarak eklemektir:

  1. Hata Ayıklama>Olmadan Başlat'ı seçerek hata ayıklamadan C++ projesini başlatın veya Ctrl+F5 klavye kısayolunu kullanın.

  2. Karma mod hata ayıklayıcısını var olan bir işleme eklemek için İşleme Ekleme Hatalarını Ayıkla'yı> seçin. Bir iletişim kutusu açılır.

    1. İşleme Ekle iletişim kutusunda listeden uygun işlemi seçin.

    2. Ekle alanında, Seç seçeneğini kullanarak Kod Türü Seç iletişim kutusunu açın.

    3. Kod Türü Seç iletişim kutusunda Bu kod türlerinde hata ayıkla seçeneğini belirleyin.

    4. Listede Python onay kutusunu ve ardından Tamam'ı seçin.

    5. Hata ayıklayıcıyı başlatmak için Ekle'yi seçin.

İpucu

Hata ayıklayıcısını eklemeden önce hata ayıklamak istediğiniz Python kodunu çağırmadığından emin olmak için C++ uygulamasına bir duraklatma veya gecikme ekleyebilirsiniz.

Karma moda özgü özellikleri keşfetme

Visual Studio, uygulamanızda hata ayıklamayı kolaylaştırmak için çeşitli karma mod hata ayıklama özellikleri sağlar:

Birleşik çağrı yığını kullanma

Çağrı Yığını penceresi hem yerel hem de Python yığın çerçevelerinin birbirine katılmış olduğunu ve ikisi arasında geçişlerin işaretlendiğini gösterir:

Visual Studio'da karma mod hata ayıklama ile birleştirilmiş çağrı yığını penceresinin ekran görüntüsü.

  • Geçiş yönünü belirtmeden geçişlerin [Dış Kod] olarak görünmesini sağlamak için Araçlar>Seçenekler>Hata Ayıklama>Genel>Yalnızca Kodumu Etkinleştir seçeneğini ayarlayın.

  • Herhangi bir çağrı çerçevesini etkin hale getirmek için çerçeveye çift tıklayın. Bu eylem, mümkünse ilgili kaynak kodunu da açar. Kaynak kodu kullanılamıyorsa, çerçeve hala etkin hale getirilir ve yerel değişkenler incelenebilir.

Python ile yerel kod arasında adım

Visual Studio, karma mod hata ayıklayıcının kod türleri arasındaki değişiklikleri doğru şekilde işlemesini sağlamak için Adımla (F11) veya Dışarı Adımla (Shift+F11) komutlarını sağlar.

  • Python C'de uygulanan bir türün yöntemini çağırdığında, bu yönteme yapılan bir çağrıda adımlama yöntemi uygulayan yerel işlevin başında durur.

  • Yerel kod, Python kodunun çağrılmasını sağlayan bir Python API işlevini çağırdığında da aynı davranış oluşur. Başlangıçta Python'da tanımlanan bir işlev değeri üzerinde çağrısına PyObject_CallObject adımlama, Python işlevinin başında durur.

  • Python'dan yerele adımlama, Python'dan ctypes aracılığıyla çağrılan yerel işlevler için de desteklenir.

Yerel kodda PyObject değerleri görünümünü kullanma

Yerel (C veya C++) çerçeve etkin olduğunda, yerel değişkenleri hata ayıklayıcı Yereller penceresinde gösterilir. Yerel Python uzantısı modüllerinde, bu değişkenlerin çoğu türündedir PyObject (için _objectbir tür tanımıdır) veya birkaç temel Python türü daha vardır. Karma mod hata ayıklamada, bu değerler [Python görünümü] etiketli başka bir alt düğüm sunar.

  • Değişkenin Python gösterimini görüntülemek için düğümü genişletin. Değişkenlerin görünümü, aynı nesneye başvuran yerel bir değişkenin Python çerçevesinde mevcut olması durumunda gördükleriniz ile aynıdır. Bu düğümün alt öğeleri düzenlenebilir.

    Visual Studio'daki Yereller penceresinde Python Görünümünü gösteren ekran görüntüsü.

  • Bu özelliği devre dışı bırakmak için Yerel ayarlar penceresinde herhangi bir yere sağ tıklayın ve Python>Python Görünüm Düğümlerini Göster menü seçeneğini değiştirin:

    Yerel Ayarlar penceresi için Python Görünüm Düğümlerini Göster seçeneğinin nasıl etkinleştirildiğini gösteren ekran görüntüsü.

Python görünüm düğümlerini gösteren C türleri

Aşağıdaki C türleri etkinse [Python görünümü] düğümlerini gösterir:

  • PyObject
  • PyVarObject
  • PyTypeObject
  • PyByteArrayObject
  • PyBytesObject
  • PyTupleObject
  • PyListObject
  • PyDictObject
  • PySetObject
  • PyIntObject
  • PyLongObject
  • PyFloatObject
  • PyStringObject
  • PyUnicodeObject

[Python görünümü] kendi oluşturduğunuz türler için otomatik olarak görünmez. Python 3.x için uzantılar yazarken, bu eksiklik genellikle bir sorun değildir. Herhangi bir ob_base nesnenin sonunda listelenen C türlerinden birinin alanı vardır ve bu da [Python görünümü] öğesinin görünmesine neden olur.

Python kodunda yerel değerleri görüntüleme

Bir Python çerçevesi etkin olduğunda Yereller penceresinde yerel değerler için [C++ görünümünü] etkinleştirebilirsiniz. Bu özellik varsayılan olarak etkin değildir.

  • Özelliği etkinleştirmek için Yereller penceresine sağ tıklayın ve Python>C++ Düğümleri Görüntüle menü seçeneğini ayarlayın.

    Yerel Ayarlar penceresi için C++ Görünüm Düğümlerini Göster seçeneklerinin nasıl etkinleştirildiğini gösteren ekran görüntüsü.

  • [C++ görünümü] düğümü, yerel çerçevede gördüklerinize benzer bir değer için temel alınan C/C++ yapısının bir gösterimini sağlar. Python uzun tamsayısı _longobject için PyLongObject bir örneği (için typedef) gösterir ve kendi yazdığınız yerel sınıflar için türleri çıkarmaya çalışır. Bu düğümün alt öğeleri düzenlenebilir.

    Visual Studio'daki Yereller penceresinde C++ Görünümünü gösteren ekran görüntüsü.

Bir nesnenin alt alanı türündeyse PyObjectveya başka bir desteklenen türdeyse , [Python görünümü] temsil düğümü vardır (bu gösterimler etkinleştirildiyse). Bu davranış, bağlantıların doğrudan Python'a sunulmadığı nesne grafiklerinde gezinmeyi mümkün kılar.

Nesnenin türünü belirlemek için Python nesne meta verilerini kullanan [Python görünümü] düğümlerinden farklı olarak [C++ görünümü] için benzer şekilde güvenilir bir mekanizma yoktur. Genel olarak belirtmek gerekirse, python değeri (başvuru) söz konusu olduğunda, hangi C/C++ yapısının bunu desteklediğini güvenilir bir PyObject şekilde belirlemek mümkün değildir. Karma mod hata ayıklayıcısı, nesne türündeki işlev işaretçisi türlerine sahip çeşitli alanlara (örneğin PyTypeObject , alanı tarafından ob_type başvurulur) bakarak türü tahmin etmeye çalışır. Bu işlev işaretçilerinden biri çözümlenebilen bir işleve başvurursa ve bu işlevin türünden PyObject*daha özel bir self parametre varsa, bu türün yedekleme türü olduğu varsayılır.

Verilen nesnenin değerinin ob_type->tp_init aşağıdaki işleve işaret ettiği aşağıdaki örneği göz önünde bulundurun:

static int FobObject_init(FobObject* self, PyObject* args, PyObject* kwds) {
    return 0;
}

Bu durumda, hata ayıklayıcısı nesnenin C türünün olduğunu FobObjectdoğru şekilde ayıklayabilir. Hata ayıklayıcısı'ndan tp_initdaha kesin bir tür belirleyemezse, diğer alanlara geçer. Bu alanlardan herhangi birinden türü çıkaramıyorsa , [C++ görünümü] düğümü nesneyi örnek PyObject olarak sunar.

Özel yazılmış türler için her zaman yararlı bir gösterim elde etmek için, türü kaydederken en az bir özel işlev kaydetmek ve kesin olarak yazılmış self bir parametre kullanmak en iyisidir. Çoğu tür bu gereksinimi doğal olarak karşılar. Diğer türlerde, tp_init denetim genellikle bu amaç için kullanılacak en uygun giriştir. Yalnızca hata ayıklayıcı türü çıkarımının etkinleştirilmesi için mevcut bir tür için sahte uygulaması tp_init , önceki örnekte olduğu gibi hemen sıfır döndürebilir.

Standart Python hata ayıklama arasındaki farkları gözden geçirin

Karma mod hata ayıklayıcısı, standart Python hata ayıklayıcısından farklıdır. Bazı ek özellikler sunar, ancak Python ile ilgili bazı özelliklerden aşağıda gösterildiği gibi eksiktir:

  • Desteklenmeyen özellikler arasında koşullu kesme noktaları, Etkileşimli Hata Ayıklama penceresi ve platformlar arası uzaktan hata ayıklama yer alır.
  • Anlık penceresi kullanılabilir, ancak bu bölümde listelenen tüm sınırlamalar da dahil olmak üzere işlevselliğinin sınırlı bir alt kümesine sahiptir.
  • Desteklenen Python sürümleri yalnızca CPython 2.7 ve 3.3+ sürümlerini içerir.
  • Python'ı Visual Studio Shell ile kullanmak için (örneğin, tümleşik yükleyiciyle yüklerseniz), Visual Studio C++ projelerini açamaz. Sonuç olarak, C++ dosyalarının düzenleme deneyimi yalnızca temel bir metin düzenleyicisinin deneyimidir. Bununla birlikte, kaynak koduyla Shell'de C/C++ hata ayıklama ve karma mod hata ayıklama tam olarak desteklenir, yerel koda adımlama ve hata ayıklayıcı pencerelerinde C++ ifadesi değerlendirmesi yapılır.
  • Yerel Ayarlar ve İzleme hata ayıklayıcısı araç pencerelerinde Python nesnelerini görüntülediğinizde, karma mod hata ayıklayıcısı yalnızca nesnelerin yapısını gösterir. Özellikleri otomatik olarak değerlendirmez veya hesaplanan öznitelikleri göstermez. Koleksiyonlar için yalnızca yerleşik koleksiyon türlerine (tuple, list, , dictset) yönelik öğeleri gösterir. Özel koleksiyon türleri, bazı yerleşik koleksiyon türlerinden devralınmadığı sürece koleksiyon olarak görselleştirilemez.
  • İfade değerlendirmesi, aşağıdaki bölümde açıklandığı gibi işlenir.

İfade değerlendirmeyi kullanma

Standart Python hata ayıklayıcısı, bir G/Ç işleminde veya benzer bir sistem çağrısında engellenmediği sürece, hata ayıklanan işlem kodun herhangi bir noktasında duraklatıldığında İzleme ve Anlık pencerelerde rastgele Python ifadelerinin değerlendirilmesine olanak tanır. Karma mod hata ayıklamada rastgele ifadeler yalnızca Python kodunda durdurulduğunda, kesme noktasından sonra veya koda adımlarken değerlendirilebilir. İfadeler yalnızca kesme noktasının veya adımlama işleminin gerçekleştiği iş parçacığında değerlendirilebilir.

Hata ayıklayıcı yerel kodda veya bir dışarı çıkarma işleminden sonra veya farklı bir iş parçacığında olduğu gibi, açıklanan koşulların uygulanmadığı Python kodunda durduğunda). İfade değerlendirmesi, seçili durumdaki çerçeve kapsamındaki yerel ve genel değişkenlere erişmek, alanlarına erişmek ve yerleşik koleksiyon türlerini değişmez değerlerle dizine eklemekle sınırlıdır. Örneğin, aşağıdaki ifade herhangi bir bağlamda değerlendirilebilir (tüm tanımlayıcılar mevcut değişkenlere ve uygun türlerdeki alanlara başvuruda bulunur):

foo.bar[0].baz['key']

Karma mod hata ayıklayıcısı da bu tür ifadeleri farklı şekilde çözümler. Tüm üye erişim işlemleri yalnızca doğrudan nesnenin parçası olan alanları arar (örneğin, veya __slots__içindeki __dict__ bir girdi ya da aracılığıyla Python'a tp_memberssunulan yerel bir yapının alanı) ve herhangi __getattr__bir , __getattribute__veya tanımlayıcı mantığını yoksayar. Benzer şekilde, tüm dizin oluşturma işlemleri öğesini yoksayar __getitem__ve koleksiyonların iç veri yapılarını doğrudan erişer.

Tutarlılık açısından, bu ad çözümleme düzeni sınırlı ifade değerlendirmesi kısıtlamalarıyla eşleşen tüm ifadeler için kullanılır. Bu düzen, geçerli durdurma noktasında rastgele ifadelere izin verilip verilmediğine bakılmaksızın uygulanır. Tam özellikli bir değerlendirici kullanılabilir olduğunda uygun Python semantiğini zorlamak için ifadeyi parantez içine alın:

(foo.bar[0].baz['key'])