Friday, November 10, 2006

Buffer debugging

Some standard library implementations, such as the one that ships with MSVC 8.0, provide a nifty feature called iterator debugging. What this means is that the validity of your iterators is checked at runtime. If you try to use an iterator that has been invalidated, you'll get an assertion. For example:
std::vector<int> v(1)
std::vector<int>::iterator i = v.begin();
v.clear(); // invalidates iterators
*i = 0; // assertion!
Boost.Asio now takes advantage of this feature to add buffer debugging. Consider the following code:
void dont_do_this()
{
std::string msg = "Hello, world!";
asio::async_write(sock, asio::buffer(msg), my_handler);
}
When you call an asynchronous read or write you need to ensure that the buffers for the operation are valid until the completion handler is called. In the above example, the buffer is the std::string variable msg. This variable is on the stack, and so it goes out of scope before the asynchronous operation completes. If you're lucky, your application will crash. Often you will get random failures.

With the new buffer debug checking, however, Boost.Asio stores an iterator into the string until the asynchronous operation completes, and then dereferences it to check its validity. In the above example you get an assertion failure just before Boost.Asio tries to call the completion handler.

This feature has only been tested with MSVC 8.0 so far, but it should work with any other implementation that supports iterator debugging. Obviously there's a performance cost to this checking, so it's only enabled in debug builds. You can also explicitly disable it by defining BOOST_ASIO_DISABLE_BUFFER_DEBUGGING (or ASIO_DISABLE_BUFFER_DEBUGGING if you're using standalone asio).

12 comments:

Anonymous said...

Hi Chris!

First of all, thanks for the great library!

I just wondered about the behaviour of this buffer debugging thing if the buffer length is zero, e.g.:

[...]
string content = ...
array<asio::const_buffer, 2> buffers = {
asio::buffer(header_ptr, sizeof(header_t)),
asio::buffer(content)
};
asio::async_write(socket_, buffers, boost::bind(...));

This is what I tried to do in my prototype I'm currently building.
Well, the problem I ran into is that the content string would sometimes have length 0, and that triggered an assertion failure because (obviously) the iterator could not be dereferenced then.
So, I wondered whether this is the intended behaviour (in other words: a feature, not a bug)?

chris said...

Hi Andi,

Actually I fixed this bug not so long ago:

http://asio.cvs.sourceforge.net/asio/asio/include/asio/buffer.hpp?r1=1.22&r2=1.23

chris said...

Let's try that link again:

diff for bug fix

Anonymous said...

Oh! Thanks for telling and good luck with your async' arts!

thomas said...

It’s awesome to pay a visit to this web page and reading the views of all friends regarding this paragraph, while I am also eager of getting experience.
3Movierulz

GOSTOPSITE33 said...

This is by far the best post I've seen recently. This article, which has been devoted to your efforts, has helped me to complete my task.
Appreciating the persistence you put into your blog and detailed information you provide.
I really love the theme/design of your website.
고스톱

TOTOSITEWEB33 said...

Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
안전놀이터

GUIDE1903 said...

This is my first time i visit here. I found so many interesting stuff in your blog especially its discussion.
일본야동

TOTOSAFEDB33 said...

From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here keep up the good work.
토토사이트

Unknown said...

All the games you can play on the Sega Genesis - AprCasino
The best part is, of course, the game, is that there casino-roll.com are poormansguidetocasinogambling very few people septcasino who do a apr casino lot kadangpintar of the hard work. The best part is, if the

koe61831 said...

Money is needed for everything, even for tutoring, so I use paper writer , which helps many people to do any kind of written work that will help them improve their grades and maybe even academics

Dijital Pazarlamacilar said...

Affiliate, ortaklara veya bağlı kuruluşlara sitenize getirdikleri herhangi bir müşteri için komisyon sunan güçlü bir internet pazarlama aracıdır. Bu normalde tıklama başına maliyet esasına göre yapılır, çünkü tıklama başına ödeme yapmak ucuz olabilir.

Diğer seçenekler şunları içerir:

müşteri adayı başına ödeme - bu, müşteriyle kendiniz iletişime geçmeniz ve kendi satışlarınızı yapmanız için daha kaliteli potansiyel müşterilerle sonuçlanabilir
satış başına ödeme - bağlı kuruluşların ve web sitenizin sizin için satış yaptığı yer (web siteniz üzerinden kolayca satılan bir ürününüz varsa kullanışlıdır)
Bağlı kuruluş pazarlaması aşağıdakilerin güçlü bir yolu olabilir:

web satışlarınızı artırma
çevrimiçi marka erişiminizi geliştirmek
benzer bir siteden gelen ziyaretçilerin ürünlerinizle ilgilenme olasılığı çok daha yüksek olduğundan, yeni bir ülkede müşteri bulma
Ortaklık programları giderek daha rekabetçi hale geliyor. Bağlı kuruluşlar, sizi ve programınızı diğer bağlı kuruluş programlarına karşı sürekli olarak ölçecektir, bu nedenle rekabeti araştırmak çok önemlidir.

Bağlı kuruluş pazarlama programı nasıl kurulur
Bir web sitesinde yalnızca birkaç saniye durabilecek kişileri çekmek için sitenizin etkili bir tasarıma ve ilginç içeriğe ihtiyacı vardır. Bunu yapmanın yolu yeni içerik eklemektir - ideal olarak her gün veya en az haftada bir veya iki kez.

Bağlantılar oluşturmak da önemlidir. Bunu, sizin sitenize bir başkasının sitesine bir bağlantı koyarak ve onlar da aynı şeyi yaparak ya da konuk içerik sağlayıcısı veya blog yorumcusu olarak yararlı bilgiler içeren başka sitelere göndererek yapabilirsiniz. Buradaki zorluk, sitenize bağlı bir ürün sunan bağlı kuruluşlara bağlantılar göndermektir.

Ardından reklamverenler ekleyebilirsiniz - bu ortaklıklar, bağlı kuruluş pazarlamacısı olarak para kazanma yönteminizdir, bu yüzden onları akıllıca seçin.

Ayrıca bir harekete geçirici mesaj oluşturmanız gerekir - sitenizde ziyaretçilerinizin istediğinizi yapmasını sağlayan içerik, yani reklamvereninizin bağlantılarını tıklamanız. Harekete geçirici mesaj örnekleri şunları içerir:

bir banner reklama tıklamak
proje sipariş etmek
bilgi almak için bir müşteri adayı oluşturma formu doldurma
Bağlı kuruluş pazarlamasının çeşitli faydaları vardır, örneğin:

maliyet etkinliği
uzun vadeli bir yatırım olabilir
bağlı kuruluş web sitelerinizde reklam vermenin ön maliyeti olmadığından daha az risklidir
fazladan pazarlama personeline ihtiyacınız yok
asla para kaybetmezsiniz - yalnızca bir reklam başarılı olduğunda ödeme yaparsınız
müşterilerinizin nereden geldiğini ve ne kadar harcadıklarını takip edebilirsiniz
reklamlarınız için en başarılı yerleri belirleyebilirsiniz