Software Breakpoint Hakkında

Başlatan yamak, 20 Haziran 2016, 10:36:36

yamak

Merhaba arkadaşlar,
Bildiğiniz gibi software breakpoint kullanıldığında breakpoint in bulunduğu instruction in bulunduğu sector erase edilip "bkpt" instruction ı yerleştirilir ki PC o satıra geldiğinde exception oluşup CPU halt durumuna düşşün.
Kendi mantığımca bu olayın debugger tarafında şu şekilde yürütüldüğünü düşünüyodum:

Arm için konuşacak olursak;
Arm 6 adet hard breakpoint desteklediğindenden dolayı 6 dan fazla breakpoint koyulduğunda(Breakpoint Type ın Auto olarak seçildiğini farzediyorum);
(Örneğin program counter 6. breakpointte beklerken bir kerede bu 6 breakpoint harici 10 farklı yere breakpoint koyduğumuzu düşünelim.)
Bu durumda programı run ettiğimde,debuggerın koyduğum 10 breakpoint'in bulunduğu sectorlerin hepsini silip gerekli yerlere "bkpt" instruction ını koyması gerekir.Aslında böyle de oluyo.
Fakat anladığım kadarı bu işlemi tüm breakpointler için yapmıyo.Çünkü şöyle bir durumla karşılaştım:

Atıyorum 8. breakpoint e kadar normal bir şekilde ilerlerken 8. breakpointte run ettiğimde debugger ın flash ı yeniden programladığını gözlemledim.Yani koyduğum 10 breakpoint'in tamamı için en başta flash a "bkpt" komutu yerleştirmemiş, 9 ve 10. breakpoint için bu işlem 8. breakpointten sonra yerleştirmiş.

Bu durumda kafamı karıştıran soru şu:
Ya 9. breakpoint olduğu satura  herhangi bir exceptiondan dolayı PC gelirse ne olacak?O satır CPU halt olmadan geçilmiş olmayacak mı?Acaba ben mi yanlış düşünüyorum ya da debugger burda nasıl bir işlem yürütüyor?

z

Breakpoint komutu olan işlemciler için genel konuşuyorum.

BKPT komutu nereye yerleştirildi ise PC bu satıra geldiğinde int üretilmesine neden olur. Bu satıra nereden nasıl gelindiğinin önemi yok. Önemli olan bu satırdaki BKPT komutunun işlemiş olması.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Alıntı yapılan: z - 20 Haziran 2016, 11:12:14
Breakpoint komutu olan işlemciler için genel konuşuyorum.

BKPT komutu nereye yerleştirildi ise PC bu satıra geldiğinde int üretilmesine neden olur. Bu satıra nereden nasıl gelindiğinin önemi yok. Önemli olan bu satırdaki BKPT komutunun işlemiş olması.

Hocam tamam onu biliyorum zaten fakat benim sorduğum soru farklı.
Debugger ın bu komutu bu komutu debug esnasında nasıl yerleştirdiği.

z

Normalde bu işler flashda yapılmaz. Zamanında TI DSP için bir debugger yazmıştım.

Kodları Ram üzerinde koşturuyordum. Ramda bir komutu silip yerine BKPT yazmak daha sonra tekrar eski haline getirmek çok kolay.

Flash'da aynı işlemi yazılımsal yapmaya kalktığında flashın o sektörünü yeniden programlamak dışında çözüm yok gibi.

Yazılım koşmadan önce debugger flashı yeniden programayabilir. Fakat hoş bir çözüm değil.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam önceden o şekildeydi fakat artık flash üzerindeki programı debug ederken bile soft breakpoint koyulabiliyor.En azında J link te koyuluyor.J-link debug esnasında soft breakpoint in koyulduğu sector ü erase edip yeniden programlıyor.
https://www.segger.com/jlink-unlimited-flash-breakpoints.html

z

Tamam işte flashı yeniden programlıyor ama sıkıntılı bir çözüm. Flashı sürekli yazıp silmek hoş işlem değil.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam benim sorum şu:

Alıntı YapAtıyorum 8. breakpoint e kadar normal bir şekilde ilerlerken 8. breakpointte run ettiğimde debugger ın flash ı yeniden programladığını gözlemledim.Yani koyduğum 10 breakpoint'in tamamı için en başta flash a "bkpt" komutu yerleştirmemiş, 9 ve 10. breakpoint için bu işlem 8. breakpointten sonra yerleştirmiş.

Bu durumda kafamı karıştıran soru şu:
Ya 9. breakpoint olduğu satura  herhangi bir exceptiondan dolayı PC gelirse ne olacak?O satır CPU halt olmadan geçilmiş olmayacak mı?Acaba ben mi yanlış düşünüyorum ya da debugger burda nasıl bir işlem yürütüyor

Burak B

#7
Aslında burada olay supervisor nano servisler ile yönetiliyor genelde. Jlink debug esnasında MCU hafızasına bir supervisor yerleştiriyor. Sonra kullanıcı HW yada SW kesme kullanacağı zaman ona göre aşağıdaki komutu gerekli yerlere yerleştiriyor yada değişikliği geri alıyor diyebiliriz kabaca. Bu sadece ARM yada Cortex olarak düşünülmemeli. Çünkü ilgili konularda sıkça kullanılan genel bir teknik. Mesela en yaygın örneği Pickit olarak gösterilebilir. İçeride bir adamınızın olması işleri herzaman kolaylaştırır. :)
__ASM volatile("BKPT #01");
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

yamak

Alıntı yapılan: Burak B - 20 Haziran 2016, 12:02:06
Aslında burada olay supervisor nano servisler ile yönetiliyor genelde. Jlink debug esnasında MCU hafızasına bir supervisor yerleştiriyor. Sonra kullanıcı HW yada SW kesme kullanacağı zaman ona göre aşağıdaki komutu gerekli yerlere yerleştiriyor yada değişikliği geri alıyor diyebiliriz kabaca. Bu sadece ARM yada Cortex olarak düşünülmemeli. Çünkü ilgili konularda sıkça kullanılan genel bir teknik. Mesela en yaygın örneği Pickit olarak gösterilebilir. İçeride bir adamınızın olması işleri herzaman kolaylaştırır. :)
__ASM volatile("BKPT #01");

Hocam söylemek istediğiniz anladım.Fakat benim bahsettiğim olayda sanki ben breakpoint i koyduğum anda değilde sanki daha sonra yerleştiriliyor bkpt komutu.Ya da ben mi yanlış yorumluyorum acaba?Sonucta breakpoint i benim koyduğum anda flash ı silip yeniden programlaması gerekmez mi?Koyduğum anda bir exception oluşup tam o breakpoint vurabilir PC sonucta.

Burak B

#9
İyi diyorsunda @yamak kontrol sende değilki komuta sende. Birde bu açıdan bak. Yani sen bir komut veriyorsun ama bunu yerine getiren jtag probe. O senin verdiğin komutu nasıl isterse öyle yerine getirir. Sana karşı olan yükümlülüğü senin verdiğin komutu birşekilde yerine getirmekten başka birşey değil.

Debug realtime yapılabilen birşey değil. Bu konuda yeni çalışmalar var. "Timeless debugging" diğer bir deyişle zamandan bağımsız debug yapabilme özelliği.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

#10
Millet nasıl yapıyor bilemem. Bu işi ben yapacak olsaydım;

Eğer program bir breakpoint ile durdurmuşken yeni breakpointler ekleyeceksem zaten hiç sorun yok. Zaten kodlar koşmuyor olduğundan (CPU Breakpoint rutininde dönüp duruyor)
yeni breakponitler ekledikçe flashdaki yazılımı tekrar tekrar yenilerdim. Burada sorun yok değilmi?

Eğer kod koşuyor iken bir satıra breakpoint ekleyeceksem 0 zaman 6 hard preakpontten 1 tanesini bu amaçla alıkoyardım. Debugger istediğim satıra bu 6. hard breakponti eklediğinde ve CPU tuzağa düştüğünde daha önceki hard breakpointlerden birisini soft breakponte çevirirdim. Böylece her zaman için elimin altında 1 breakpoint boşta kalırdı.

Dert edecek bir şey yok.

mesaj birleştirme:: 20 Haziran 2016, 12:40:49

Eğer kod koşuyor iken 500 tane breakpoint ekleyeceksem ne yapardım?

Bunun cevabı önemli. Bence bir şey yapamazdık. İllaki programın bir breakpointte durmasını beklemek gerek ya da Jtag üzerinden int gönderebiliyormuyuz bir araştırmak lazım.

Eğer jtag üzerinden int gönderip CPUyu özel bir program satırına (degug rutini) çekebilirsek zaten sorun yok.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam dert etmiyorum aslında kafama takıldı sadece.
Alıntı yapılan: z - 20 Haziran 2016, 12:33:11
Millet nasıl yapıyor bilemem. Bu işi ben yapacak olsaydım;

Eğer program bir breakpoint ile durdurmuşken yeni breakpointler ekleyeceksem zaten hiç sorun yok. Zaten kodlar koşmuyor olduğundan (CPU Breakpoint rutininde dönüp duruyor)
yeni breakponitler ekledikçe flashdaki yazılımı tekrar tekrar yenilerdim. Burada sorun yok değilmi?
Hocam işte benim bahsettiğim de bu kısım sanki böyle yapmıyor gibi J-link.Yani flash ı belli bir kısmını o anda erase edip yeniden programlıyor geri kalan breakpointler için de bu işlemi yine başka bir breakpointte durduktan sonra yapıyor.

Alıntı YapEğer kod koşuyor iken bir satıra breakpoint ekleyeceksem 0 zaman 6 hard preakpontten 1 tanesini bu amaçla alıkoyardım. Debugger istediğim satıra bu 6. hard breakponti eklediğinde ve CPU tuzağa düştüğünde daha önceki hard breakpointlerden birisini soft breakponte çevirirdim. Böylece her zaman için elimin altında 1 breakpoint boşta kalırdı.

Hocam bu kısımda da şöyle bi sıkıntı olmaz mı?
Hard ı softa dönüştürmek için flash ı yeniden programlamak gerekir.



z

Soft breakpoint ekleyebilmek için flashı programlamaktan başka şansın yok. Flashı programlayabilmek için de CPU'yu senin uygulama programından çıkartıp bir debug rutinine girmesini sağlaman gerek.

Başka bir yolu yok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Tamam hocam.Konuyu daha fazla irdelemeyecem :)

z

İrdele de başka bir çözüm olabilir mi?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com