Aracılığıyla paylaş


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 Pythonyerel geliştirme araçları seçeneğini belirlediğinizde kullanılabilir:

Visual Studio Yükleyicisi'nde seçilen 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. Karma mod hata ayıklama, Visual Studio 2015 ve önceki sürümlerde Visual Studio 1.x için Python Araçları ile 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 modda 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'nde 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.

    Tip

    Yerel kod hata ayıklamayı etkinleştirdiğinizde, programın bitiminde Python çıkış penceresi hemen kapanabilir. Bu durumda, program duraklatılmadan ve Devam etmek için herhangi bir tuşa basın istemi gösterilmeden kapanma gerçekleşmiş olur. Yerel kod hata ayıklamasını etkinleştirdikten sonra duraklatma ve istem zorlamak için, -i sekmesindekiYorumlayıcı Bağımsız Değişkenlerini> alanına ekleyin. 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ı mevcut bir işleme eklemek için Hatalarını Ayıkla>İşleme Ekle'yi 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 onun yerine farklı 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, üç çalışma zamanı arasında adım adım geçiş yapmayı da içeren, birleştirilmiş çağrı yığınlarına sahip 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 dosyasına bağlanmaktır. 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. Visual Studio Yükleyicisi (Visual Studio 2017 ve üzeri) aracılığıyla Python desteği 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. https://www.python.org/downloads/source/'e gidin.

  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'da 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'nde 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ıyı başlatma seçeneği için açılır menüyü genişletin ve Python/Yerel Hata Ayıklama seçeneğini seçin.

    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ü.

    Uyarı

    Python/Yerel Hata Ayıklama seçeneğini görmüyorsanız, önce Visual Studio Yükleyicisi'ni 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 py.exe alt işlem oluşturacağından program başlatıcıda python.exe hata ayıklayamazsınız. Hata ayıklayıcı alt sürece bağlanmıyor. Bu senaryo için geçici çözüm, program python.exe'ı aşağıdaki gibi bağımsız değişkenlerle doğrudan çalıştırmaktır:

  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.

Karışık mod hata ayıklayıcısını bağlama

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 hataayıklamadan C++ projesini başlatın veya Ctrl+F5 klavye kısayolunu kullanın.

  2. Karma mod hata ayıklayıcısını mevcut bir işleme eklemek için Hatalarını Ayıkla>İşleme Ekle'yi 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.

Tip

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 modun özel özelliklerini keşfedin

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çenekleri bölmesini kullanın. Tüm Ayarlar>Hata Ayıklama>Genel bölümünü genişletin, Yalnızca Kodumu Etkinleştir onay kutusunu seçin.
  • Geçiş yönünü belirtmeden geçişlerin [Dış Kod] olarak görünmesini sağlamak için Araçlar>Seçenekleri iletişim kutusunu kullanın. Hata Ayıklama>Genel bölümünü genişletin, Yalnızca Kodumu Etkinleştir onay kutusunu seçin ve ardından Tamam'ı seçin.
  • 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, karışık mod hata ayıklayıcının kod türleri arasındaki değişiklikleri doğru şekilde işlemesini sağlamak için İçeriye Adımla (F11) veya Dışarı Adımla (Shift+F11) komutlarını sağlar.

  • Python, C'de uygulanmış bir türün yöntemini çağırdığında, bu yönteme yapılan bir adımlama çağrısı, yöntemi uygulayan yerel işlevin başlangıcı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ı modüllerinde, bu değişkenlerin çoğu PyObject türündedir (ki bu _object için bir tür tanımıdır), veya birkaç başka temel Python türü daha vardır. Karma modda hata ayıklamada, bu değerler [Python görünümü] etiketli başka bir alt düğüm gösterir.

  • 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, etkinleştirilmişse [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ı için bir _longobject örneği gösterir ve PyLongObject bunun bir typedef'idir; ayrıca, kendi yazdığınız yerel sınıflar için türleri belirlemeye ç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ü PyObject veya başka bir desteklenen türdeyse, o zaman (bu gösterimler etkinleştirildiyse) bir [Python görünümü] temsil düğümüne sahiptir. 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 konuşursak, bir Python değeri (yani, bir PyObject referans) verildiğinde, hangi C/C++ yapısının onu desteklediğini güvenilir bir şekilde belirlemek mümkün değildir. Karma mod hata ayıklayıcı, işlev işaretçisi türlerine sahip nesne türündeki çeşitli alanlara bakarak (örneğin ob_type alanının başvurduğu PyTypeObject gibi) 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ü PyObject*'den daha özel olan bir self parametre varsa, o türün temel tür olarak 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ı tp_init daha doğru bir tür belirleyemediği takdirde, 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. Sadece hata ayıklayıcı tür çıkarımını etkinleştirmek için var olan bir türün tp_init için sahte bir uygulaması, ö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, Shell üzerinden kaynak kod ile C/C++ hata ayıklama ve karma mod hata ayıklama tam olarak desteklenir, yerel koda adım atma ve hata ayıklama pencerelerinde C++ ifadelerinin değerlendirilmesi gerçekleştirilir.
  • 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 modda hata ayıklamada, rastgele ifadeler yalnızca Python kodu içinde durduğunda, kesme noktasından sonra veya koda adım atarken 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 durduğunda veya açıklanan koşulların geçerli olmadığı Python kodunda, örneğin bir adım dışarı çıkarma işlemi sonrasında veya farklı bir iş parçacığında 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, __dict__ veya __slots__ içindeki bir girdi ya da tp_members aracılığıyla Python'a sunulan yerel bir yapının alanı) ve __getattr__, __getattribute__ veya tanımlayıcı mantığını yoksayar. Benzer şekilde, tüm dizin oluşturma işlemleri __getitem__ öğesini yoksayar ve koleksiyonların iç veri yapılarına doğrudan erişir.

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'])