Dotneteers.net
All for .net, .net for all!

The story of a wicked bug

This is the story of a wicked bug. Just like in a good Agatha Christie story, the criminal has been hiding, leaving behind false evidence, framing innocents, and resisting almost any logic and attempt to be identified.

If you want to play along, dear reader, read this little blog post as you would a crime novel. Don’t flip to the end to se who the killer is. Try to guess along with the detective, and see at what point you can pinpoint the guilty one. If you only want to learn from our mistakes, you can skip to the end (after the coffee).

Here is how it starts. We are working on a new Silverlight 4 application – we’ve been working on it for quite a while in fact. It was coming along nicely. We’ve been showing it to the customer for a while, and he was pleased. But as Silverlight 4 has been released, the client decided to give it a whirl on his own computer. And he came back to us with very weird error reports and screenshots. Statuses did not get transitioned, lists did not get populated. But only some. Most of the app worked, but at some places, it did not. Of course, everything was working fine on our computers.

Maybe his computer has a virus? He tries it on a Mac, same results. Probably not a virus then. We double check the he is using the same URL. We clean his entire browser cache, try two other browsers. Works on our machines (tried several ones in fact), and behaves very strangely on his.

image What is the big difference between his machines (two different operating systems), and ours? Well, we as developers have the developer runtime of Silverlight 4, and he has the end user runtime. So, I make him install the developer runtime. Suddenly everything starts to work. Ouch. This means that there is a difference (and a big difference!) in how the developer and the end user runtime behaves. No good. Microsoft shouldn’t allow this to happen! We install a fresh new Windows 7 on a virtual machine, install only the Silverlight end user runtime on it – and surely enough, we see the same strange behavior.

So, we know where to look for the little bugger, but have no idea what it is. The project is pretty complex, and with some things working and some not, it is very hard to find. In addition to that, you cannot debug an end-user runtime – the debugging support is missing from it in order to reduce the size of the download. How to get to the end of this?

I contacted Microsoft, and after I showed them the url that behaves differently in the two runtimes, they jumped onto the problem after confirming the issue themselves. However, before we could get clearance from our customer to send source code to Microsoft, another catastrophe stroke.

In another project, we had a similar error. Displaying of a number from a server side xml file worked for us, and it did not work for those with end-user runtime (always showed 0). Fortunately, this part of the application was a lot simpler, and although the problem did not affect states (as in the other app), we hoped that we just caught a different manifestation of the same bug.

As we could not attach a debugger to the end-user runtime (which was the only one with the bad behavior), we started to add trace logs. We added debug lines to every statement in the code path from the xml file to the viewmodel, from which the number was displayed via binding. We speculated that it may be an xml parsing bug – that would explain both the problems with displaying the number from the xml document, and some strange xml parsing bug could also cause wrong interpretation of states in the first app.

The trace lines came back with good results. Meaning, it did not show any signs of xml parsing errors, and the number to be displayed was passed along very nicely to the viewmodel. The prime suspect now is the binding mechanism. But there is another number displayed next to the wrong one, which also comes from the xml, which is also integer, and which works as it should. We were clueless again, but determined to help the Silverlight team by narrowing down the issue as much as possible.

Then we noticed, that the display was working well again on the end-user runtime! WTF? We only added a dozen trace lines to the app, none of which could have any effect on the number we were displaying. But still, after removing the trace calls, things are not working anymore. This situation looks like a living proof of Schroedinger’s theory in modern computer science. Well, not really, but I wanted to have this picture in the post:

image

OK, so now we start removing trace lines. The plan is to find the one line that fixes the problem when it is there, and without which the number does not get displayed. We ended up with the trace line in the property setter for the number that is displayed. The code for the property looked like this:

public int TotalCount
{
    get { return _totalCount; }
    set { PropertySetter<int>(ref _totalCount, value); }
}

PropertySetter is a method from the ViewModelBase class, and it is how the project handles the INotifyPropertyChanged calls. Here is the code:

protected bool PropertySetter<T>(ref T p, T newValue)
{
    StackFrame frame = new StackFrame(1);
    StackTrace trace = new StackTrace(frame);
    string name = frame.GetMethod().Name.Substring(4);
    return PropertySetter(ref p, name, newValue);
}

protected bool PropertySetter<T>(ref T p, string propertyName, T newValue)
{
    if (CompareValues(ref p, newValue))
    {
        p = newValue;
        RaisePropertyChanged(propertyName);
        return true;
    }
    else
    {
        return false;
    }
}

What happens here is that we have achieved a one line way of implementing property setters, including raising the PropertyChanged event, even with optimizations to only raise it when the value actually changes. It goes up in the stack to get the name of calling method (which is the property setter), finds out the property name from it, and even sets the value of the property’s backing field. Pretty clever solution to an old problem.

So, dear reader, at this point you have every information we had to find the bug. Again, the symptom was that the application only displayed 0 for the TotalCount. Where is the bug? Why is everything OK, when we add a trace line to the property setter of TotalCount? Do we blame Microsoft? Do we blame us? Do we blame the stars? And most importantly, can we fix the bug without waiting for Microsoft to release a fixed end-user runtime?

Here, have a coffee to help you think, before I tell you who the killer was.

image

If you guessed that the problem is with the StackTrace approach, you were correct. The thing is, the Just-in-time compiler has some serious optimizations. For example, it inlines methods under certain circumstances. When the TotalCount property was set, the property setter method got inlined. Therefore, walking up the call stack by one did not result in the _setTotalCount method that the property setter was expecting. It returned the name of the method that called the setter. Because of this, the property name for the NotifyPropertyChanged method was wrong, and thus the Silverlight runtime never got notified that TotalCount has been set. Silverlight kept displaying the default (0) value for TotalCount. But for other properties, where inlining did not happen because the calling method was more complex, all worked perfectly.

And why did the adding of the trace line fix the behavior? Well, it seems like inlining does not happen when there are more than one statements in the method that is being called.

We quickly changed the NotifyPropertyChanged implementation to another one which did not rely on call stack, and voilá, everything was back to normal, on both projects. Call stack has been found guilty, and is now behind bars.

image

The moral of the story? Don’t rely on call stacks, unless you know what you are doing. And even then, think twice.

Do you think this is a bug that Microsoft should fix? Did you find the bug without peeking? Do you think we were stupid to use this approach in the first place? Let me know!


Posted May 06 2010, 07:33 PM by vbandi

Comments

Ben Reierson wrote re: The story of a wicked bug
on Thu, May 6 2010 20:12

good story, and an interesting thing to remember. I guess I question the efficiency of referencing the call stack every time you set a property just to save a few lines of code, but I can see why the bug was hard to find.

I'm not sure if I think it's something Microsoft should change, but I guess if they are going to let you use the callstack, they should warn you that it might have unexpected results at runtime.

TripleX wrote re: The story of a wicked bug
on Thu, May 6 2010 21:49

"Did you find the bug without peeking?"

As soon as I saw the StackFrame thing, I knew where the problem was :)

"Do you think we were stupid to use this approach in the first place?"

No, because you can't know everything.

------

My approach for handling the INotifyPropertyStuff is following:

ViewModel:

--------------

       public double Price

       {

           get { return _price; }

           set { SetPropertyValue(System.Reflection.MethodBase.GetCurrentMethod(), value, ref _price); }

       }

ViewModelBase:

---------------------

       protected void SetPropertyValue<T>(string propertyName, T newValue, ref T oldValue)

       {

           if (newValue == null || !newValue.Equals(oldValue))

           {

               oldValue = newValue;

               NotifyPropertyChanged(propertyName);

           }

       }

       protected void SetPropertyValue<T>(System.Reflection.MethodBase methodBase, T newValue, ref T oldValue)

       {

           SetPropertyValue(methodBase.Name.Substring(4), newValue, ref oldValue);

       }

vbandi wrote re: The story of a wicked bug
on Thu, May 6 2010 22:04

TripleX: My guess is that your approach may also be subject to the same issue. If the property setter gets inlined, GetCurrentMethod may give back different result. That is unless the compiler is smart enough never to inline a method that calls GetCurrentMethod... :)

Harsh wrote re: The story of a wicked bug
on Thu, May 6 2010 22:05

Evern Heard of Heisenbugs?

en.wikipedia.org/.../Unusual_software_bug

Great post!

vbandi wrote re: The story of a wicked bug
on Thu, May 6 2010 22:08

@Hars: no, but that was exactly the term I was looking for :) Thanks!

Twitter Trackbacks for The story of a wicked bug - VBandi's blog - Dotneteers.net [dotneteers.net] on Topsy.com wrote Twitter Trackbacks for The story of a wicked bug - VBandi's blog - Dotneteers.net [dotneteers.net] on Topsy.com
on Thu, May 6 2010 22:52

Pingback from  Twitter Trackbacks for                 The story of a wicked bug - VBandi's blog - Dotneteers.net         [dotneteers.net]        on Topsy.com

Dew Drop – May 7, 2010 | Alvin Ashcraft's Morning Dew wrote Dew Drop &#8211; May 7, 2010 | Alvin Ashcraft&#039;s Morning Dew
on Fri, May 7 2010 14:22

Pingback from  Dew Drop – May 7, 2010 | Alvin Ashcraft's Morning Dew

Nadav Popplewell wrote re: The story of a wicked bug
on Sun, May 9 2010 10:14

Another way to fix this would be to use MethodImplAttribute to tell the compiler not to inline the property getter/setters.

(assuming there is no problem with the preformance...)

vbandi wrote re: The story of a wicked bug
on Sun, May 9 2010 10:36

Thanks, Nadav... I didn't know that MethodImpl existed in Silverlight, somehow I assumed it did not :)

Tom wrote re: The story of a wicked bug
on Sun, May 9 2010 18:35

Great post, thanks!  I love this kind of story and have been there before.  The moral of the story to me is: KISS.  If you try to get fancy, you will probably suffer the consequences.

There's a Japanese proverb that I think is very applicable here: "The nail that sticks out gets hammered down."  If you do something that the system designers never anticipated, or something different from other people, your chance of getting hammered goes up drastically.  Of course, in these complex systems we work with, it's impossible to always do things like everyone else and plot a safe course, so we have to balance this against getting the job done!  And those seemingly elegant solutions are so tempting at times...

Heisenbugs can be nasty while you're dealing with them but fun once you've figured them out.  I experienced my first one while developing a DOS game.  The game had multiplayer support using a third party library that made it possible to use Win95's Winsock stack from DOS, which I used to send/receive UDP packets.  Quake made use of this technique to great success, but it used some commercial library whereas I was using a free one.

At some point as my game grew, it started behaving very strangely and usually crashing... but only on certain builds.  When I tried to add tracing code, the problem would disappear.  Eventually I narrowed it to adding/removing one line of tracing code, but the effect would change based on where the tracing code was and what other code had been added or changed.  It made no sense to me.

I gave up in despair and took a break for awhile.  Then I came back and started searching for the solution by simplifying the program - disabling chunks of it.  The problem was very slippery, but I finally discovered that it never occurred if I didn't initialize the network stack.  I stopped pursuing the multiplayer aspect of the game and continued work on other parts.

Some time later, I found out that the third party library I was using for accessing Winsock from DOS had a nasty bug - it would corrupt memory at a certain location which would end up hitting my code's stack once my program surpassed a certain size.  The bug got fixed and I brought multiplayer support back, but the experience left a strong impression on me.

I really appreciate that this sort of thing generally can't happen when working with managed code.  And I appreciate the power of debugging by simplification, and the deeper lesson there.  Complexity is our most deadly enemy... right up there with those who deprecate our most beloved APIs against all logic and decency, but that's a story for another time. :)

vbandi wrote re: The story of a wicked bug
on Sun, May 9 2010 19:02

Thank you Tom, for sharing that story! Everybody meets a Heisenbug sooner or late, and yes they can drive you crazy until you find the reason. I found that systematically simplifying the project, and trying to create the smallest possible repro is the best approach to deal with them (as you said it yourself).

Gergely Orosz wrote re: The story of a wicked bug
on Sun, May 9 2010 23:40

Nice detective story, I couldn't guess the what the issue was. It smells like a bug to me... at least until it's not documented as a known issue in the release documentation by Microsoft.

Thanks for sharing, now I know to look out for inlining....

Jonathan van de Veen wrote re: The story of a wicked bug
on Mon, May 10 2010 9:07

Great story. I don't feel there is actually anything wrong with the Silverlight runtime for behaving the way it does. It does exactly what one would expect. The fact that your code was optimized was also expected. So from my point of view Microsoft should leave it as it is. If there should be a change it should be a warning in the API or the compiler when using the StackFrame in production code.

Still, thanks for sharing.

gerleim wrote re: The story of a wicked bug
on Mon, May 10 2010 11:27

It's easy to be clever and find the problem - after you have already solved:

blogs.msdn.com/.../399287.aspx

B3500 Coolant Clinton, B3500 Encyclopedia Britannica wrote B3500 Coolant Clinton, B3500 Encyclopedia Britannica
on Thu, May 20 2010 21:04

Pingback from  B3500 Coolant Clinton, B3500 Encyclopedia Britannica

Peavey Escort 3000 Operation Watts Per Channel, Sl2 Hid Low Beam Xenon Conversion Kit wrote Peavey Escort 3000 Operation Watts Per Channel, Sl2 Hid Low Beam Xenon Conversion Kit
on Thu, May 20 2010 21:07

Pingback from  Peavey Escort 3000 Operation Watts Per Channel, Sl2 Hid Low Beam Xenon Conversion Kit

F 250 Pickup Trucks F450, 2004 Ford F450 Super Duty King Ranch wrote F 250 Pickup Trucks F450, 2004 Ford F450 Super Duty King Ranch
on Thu, May 20 2010 21:08

Pingback from  F 250 Pickup Trucks F450, 2004 Ford F450 Super Duty King Ranch

Tempest Arcade Game 1980 Lunar Lander, 1967 Tempest Custom Wheels wrote Tempest Arcade Game 1980 Lunar Lander, 1967 Tempest Custom Wheels
on Thu, May 20 2010 21:15

Pingback from  Tempest Arcade Game 1980 Lunar Lander, 1967 Tempest Custom Wheels

1974 Benz 240d Radiator Mercedes 190d Cl55 Amg, 280e Discount Oem Mercedes 240d wrote 1974 Benz 240d Radiator Mercedes 190d Cl55 Amg, 280e Discount Oem Mercedes 240d
on Thu, May 20 2010 21:25

Pingback from  1974 Benz 240d Radiator Mercedes 190d Cl55 Amg, 280e Discount Oem Mercedes 240d

T1000 Fiero Pontiac Parisienne, Electrom?nager Discount R?gion Parisienne wrote T1000 Fiero Pontiac Parisienne, Electrom?nager Discount R?gion Parisienne
on Thu, May 20 2010 21:28

Pingback from  T1000 Fiero Pontiac Parisienne, Electrom?nager Discount R?gion Parisienne

Used 2004 Infiniti Qx56 Cobalt Blue, Ss Projector Headlights 2007 Chevrolet Cobalt wrote Used 2004 Infiniti Qx56 Cobalt Blue, Ss Projector Headlights 2007 Chevrolet Cobalt
on Thu, May 20 2010 21:36

Pingback from  Used 2004 Infiniti Qx56 Cobalt Blue, Ss Projector Headlights 2007 Chevrolet Cobalt

Gnc K25 C2500 Suburban, C15 C1500 Suburban Cheap 3rd Row Seat wrote Gnc K25 C2500 Suburban, C15 C1500 Suburban Cheap 3rd Row Seat
on Thu, May 20 2010 21:45

Pingback from  Gnc K25 C2500 Suburban, C15 C1500 Suburban Cheap 3rd Row Seat

Aftermarket J2000 Pontiac Trans Sport, J2000 Lightning Bulb wrote Aftermarket J2000 Pontiac Trans Sport, J2000 Lightning Bulb
on Thu, May 20 2010 21:50

Pingback from  Aftermarket J2000 Pontiac Trans Sport, J2000 Lightning Bulb

Concept Lexus Is250 Aftermarket, 250sl Performance Complete wrote Concept Lexus Is250 Aftermarket, 250sl Performance Complete
on Fri, May 21 2010 1:41

Pingback from  Concept Lexus Is250 Aftermarket, 250sl Performance Complete

Montana Aftermarket Grand Sunfire Pontiac Solstice, Aftermarket Parts 97 G6 Pontiac Sunfire wrote Montana Aftermarket Grand Sunfire Pontiac Solstice, Aftermarket Parts 97 G6 Pontiac Sunfire
on Fri, May 21 2010 1:58

Pingback from  Montana Aftermarket Grand Sunfire Pontiac Solstice, Aftermarket Parts 97 G6 Pontiac Sunfire

Gmc C25 C2500 Pickup Coupon S15 Jimmy, Price Our Gmc C25 C2500 Suburban wrote Gmc C25 C2500 Pickup Coupon S15 Jimmy, Price Our Gmc C25 C2500 Suburban
on Fri, May 21 2010 2:03

Pingback from  Gmc C25 C2500 Pickup Coupon S15 Jimmy, Price Our Gmc C25 C2500 Suburban

Volkswagen Fastback Bumper Fog Light, 1967 Mustang Fastback Engine wrote Volkswagen Fastback Bumper Fog Light, 1967 Mustang Fastback Engine
on Fri, May 21 2010 2:22

Pingback from  Volkswagen Fastback Bumper Fog Light, 1967 Mustang Fastback Engine

Magentis Used Driving, Magentis Manual Instant wrote Magentis Used Driving, Magentis Manual Instant
on Fri, May 21 2010 2:25

Pingback from  Magentis Used Driving, Magentis Manual Instant

600sel Car 300sd Mercedes W140, 600sel Part Body Kit Headlight Assembly wrote 600sel Car 300sd Mercedes W140, 600sel Part Body Kit Headlight Assembly
on Fri, May 21 2010 2:31

Pingback from  600sel Car 300sd Mercedes W140, 600sel Part Body Kit Headlight Assembly

Cirrostratus Sale S Tec 556, Asics Stratus 2.1 wrote Cirrostratus Sale S Tec 556, Asics Stratus 2.1
on Fri, May 21 2010 2:41

Pingback from  Cirrostratus Sale S Tec 556, Asics Stratus 2.1

Bobcat Skid Steer Toy, 1976 Mercury Bobcat National Highway Traffic Safety Administration wrote Bobcat Skid Steer Toy, 1976 Mercury Bobcat National Highway Traffic Safety Administration
on Fri, May 21 2010 2:43

Pingback from  Bobcat Skid Steer Toy, 1976 Mercury Bobcat National Highway Traffic Safety Administration

1967 Pontiac Price Gto Specifications, 1966 Pontiac Gto Headers wrote 1967 Pontiac Price Gto Specifications, 1966 Pontiac Gto Headers
on Fri, May 21 2010 2:45

Pingback from  1967 Pontiac Price Gto Specifications, 1966 Pontiac Gto Headers

Reebook Premier Trinity Kfs, Plug Adobe Premiere Pro Cs3 wrote Reebook Premier Trinity Kfs, Plug Adobe Premiere Pro Cs3
on Fri, May 21 2010 2:59

Pingback from  Reebook Premier Trinity Kfs, Plug Adobe Premiere Pro Cs3

Precis Part Cordia Galant Mitsubishi Montero Sport, Listen Mitsubishi Cordia wrote Precis Part Cordia Galant Mitsubishi Montero Sport, Listen Mitsubishi Cordia
on Fri, May 21 2010 3:02

Pingback from  Precis Part Cordia Galant Mitsubishi Montero Sport, Listen Mitsubishi Cordia

S70 Part Alternative Headlight Assembly, Turbo Top Quality 1999 Volvo S70 wrote S70 Part Alternative Headlight Assembly, Turbo Top Quality 1999 Volvo S70
on Fri, May 21 2010 3:12

Pingback from  S70 Part Alternative Headlight Assembly, Turbo Top Quality 1999 Volvo S70

Torrie Wilson Trish Stratus Kelly Kelly, Cirrus Headlight Stratus 1aauto Free Shipping wrote Torrie Wilson Trish Stratus Kelly Kelly, Cirrus Headlight Stratus 1aauto Free Shipping
on Fri, May 21 2010 3:14

Pingback from  Torrie Wilson Trish Stratus Kelly Kelly, Cirrus Headlight Stratus 1aauto Free Shipping

Tercel Lampshade, Performance Toyota Tercel wrote Tercel Lampshade, Performance Toyota Tercel
on Fri, May 21 2010 3:19

Pingback from  Tercel Lampshade, Performance Toyota Tercel

Comparison Fujifilm Finepix J30, 199 Infiniti J30 Specs wrote Comparison Fujifilm Finepix J30, 199 Infiniti J30 Specs
on Fri, May 21 2010 3:22

Pingback from  Comparison Fujifilm Finepix J30, 199 Infiniti J30 Specs

Foxx Part Oscar Nominee, Volkswagen Fox Tube Fog Light wrote Foxx Part Oscar Nominee, Volkswagen Fox Tube Fog Light
on Fri, May 21 2010 3:36

Pingback from  Foxx Part Oscar Nominee, Volkswagen Fox Tube Fog Light

Information Treaty Of Versailles, Lincoln Versailles Cadillac Seville Ford Granada wrote Information Treaty Of Versailles, Lincoln Versailles Cadillac Seville Ford Granada
on Fri, May 21 2010 3:45

Pingback from  Information Treaty Of Versailles, Lincoln Versailles Cadillac Seville Ford Granada

S60r Sell Volvo Xc70, S60r Coolant Ford wrote S60r Sell Volvo Xc70, S60r Coolant Ford
on Fri, May 21 2010 5:19

Pingback from  S60r Sell Volvo Xc70, S60r Coolant Ford

1993 Acura Integra Performance Parts, Acura Mdx 2003 For Sale wrote 1993 Acura Integra Performance Parts, Acura Mdx 2003 For Sale
on Fri, May 21 2010 5:38

Pingback from  1993 Acura Integra Performance Parts, Acura Mdx 2003 For Sale

1960 Ford Falcon Ute, Falcon Dryer wrote 1960 Ford Falcon Ute, Falcon Dryer
on Fri, May 21 2010 5:42

Pingback from  1960 Ford Falcon Ute, Falcon Dryer

S55 Amg Factory Price S430 S500 Mercedes Cl500, 2006 Mercedes Benz S500i wrote S55 Amg Factory Price S430 S500 Mercedes Cl500, 2006 Mercedes Benz S500i
on Fri, May 21 2010 5:45

Pingback from  S55 Amg Factory Price S430 S500 Mercedes Cl500, 2006 Mercedes Benz S500i

528e Parts Performance Tail Light, 528e Boiler Vehicle wrote 528e Parts Performance Tail Light, 528e Boiler Vehicle
on Fri, May 21 2010 6:05

Pingback from  528e Parts Performance Tail Light, 528e Boiler Vehicle

Lacrosse Price 2010 Ford Taurus Comparison, Lacrosse Reviews Used Buick wrote Lacrosse Price 2010 Ford Taurus Comparison, Lacrosse Reviews Used Buick
on Fri, May 21 2010 6:13

Pingback from  Lacrosse Price 2010 Ford Taurus Comparison, Lacrosse Reviews Used Buick

Sale Specs Diamante Mitsubishi Montero Sport, 2002 Mitsubishi Diamante Sale Lancer Evolution wrote Sale Specs Diamante Mitsubishi Montero Sport, 2002 Mitsubishi Diamante Sale Lancer Evolution
on Fri, May 21 2010 6:19

Pingback from  Sale Specs Diamante Mitsubishi Montero Sport, 2002 Mitsubishi Diamante Sale Lancer Evolution

Mazda Cx9 Discount Crossover Suv, Cx90 Reliability wrote Mazda Cx9 Discount Crossover Suv, Cx90 Reliability
on Fri, May 21 2010 6:23

Pingback from  Mazda Cx9 Discount Crossover Suv, Cx90 Reliability

1966 Honda S600 Couple For Sale, S600 Radiator Brand New wrote 1966 Honda S600 Couple For Sale, S600 Radiator Brand New
on Fri, May 21 2010 6:38

Pingback from  1966 Honda S600 Couple For Sale, S600 Radiator Brand New

380se 1985 Bmw 318i, Benz 380sec Used 1983 Mercedes Condition wrote 380se 1985 Bmw 318i, Benz 380sec Used 1983 Mercedes Condition
on Fri, May 21 2010 6:40

Pingback from  380se 1985 Bmw 318i, Benz 380sec Used 1983 Mercedes Condition

Xl 1500 To Buy 2005 Gmc Yukon, Savana 3500 Sale Yukon Xl Envoy Xuv Gmc Sonoma wrote Xl 1500 To Buy 2005 Gmc Yukon, Savana 3500 Sale Yukon Xl Envoy Xuv Gmc Sonoma
on Fri, May 21 2010 6:54

Pingback from  Xl 1500 To Buy 2005 Gmc Yukon, Savana 3500 Sale Yukon Xl Envoy Xuv Gmc Sonoma

1990 Alero Sale Oldsmobile Achieva, Alero Sold Automotive wrote 1990 Alero Sale Oldsmobile Achieva, Alero Sold Automotive
on Fri, May 21 2010 7:03

Pingback from  1990 Alero Sale Oldsmobile Achieva, Alero Sold Automotive

Pt 1998 Bmw 323is Car Specs, 323is Episode Maintenance Bmw 325i wrote Pt 1998 Bmw 323is Car Specs, 323is Episode Maintenance Bmw 325i
on Fri, May 21 2010 7:23

Pingback from  Pt 1998 Bmw 323is Car Specs, 323is Episode Maintenance Bmw 325i

R500 Repair Computer, R500 Radiator Vehicle Glidden wrote R500 Repair Computer, R500 Radiator Vehicle Glidden
on Fri, May 21 2010 7:32

Pingback from  R500 Repair Computer, R500 Radiator Vehicle Glidden

Volkswagen Phaeton Headlight Vehicle Fog Light, Phaeton Earth wrote Volkswagen Phaeton Headlight Vehicle Fog Light, Phaeton Earth
on Fri, May 21 2010 7:36

Pingback from  Volkswagen Phaeton Headlight Vehicle Fog Light, Phaeton Earth

262 Aftermarket Re, 262 Part Rca Repair Problems wrote 262 Aftermarket Re, 262 Part Rca Repair Problems
on Fri, May 21 2010 7:39

Pingback from  262 Aftermarket Re, 262 Part Rca Repair Problems

Donita Sparks Torrent Mb, Alyssa Milano Poison Ivy Torrent wrote Donita Sparks Torrent Mb, Alyssa Milano Poison Ivy Torrent
on Fri, May 21 2010 7:56

Pingback from  Donita Sparks Torrent Mb, Alyssa Milano Poison Ivy Torrent

Bulb 1998 200sx Nissan 240sx, 200sx Sell 1995 Nissan wrote Bulb 1998 200sx Nissan 240sx, 200sx Sell 1995 Nissan
on Fri, May 21 2010 8:03

Pingback from  Bulb 1998 200sx Nissan 240sx, 200sx Sell 1995 Nissan

Auto Usate Yaris Milano, Milano Craigslist Miles wrote Auto Usate Yaris Milano, Milano Craigslist Miles
on Fri, May 21 2010 8:13

Pingback from  Auto Usate Yaris Milano, Milano Craigslist Miles

S60r Neon, Volvo S60r Substitute Anti wrote S60r Neon, Volvo S60r Substitute Anti
on Fri, May 21 2010 8:16

Pingback from  S60r Neon, Volvo S60r Substitute Anti

Gto Hood Factory Firebird, Firebird Sale Trans Am Parts Z28 wrote Gto Hood Factory Firebird, Firebird Sale Trans Am Parts Z28
on Fri, May 21 2010 8:37

Pingback from  Gto Hood Factory Firebird, Firebird Sale Trans Am Parts Z28

Fusion Ep Universidad Complutense De Madrid, Big Bertha Fusion Specifications wrote Fusion Ep Universidad Complutense De Madrid, Big Bertha Fusion Specifications
on Fri, May 21 2010 8:40

Pingback from  Fusion Ep Universidad Complutense De Madrid, Big Bertha Fusion Specifications

Silhouette Oem Sales, Silhouette Headlight Genuine wrote Silhouette Oem Sales, Silhouette Headlight Genuine
on Fri, May 21 2010 9:00

Pingback from  Silhouette Oem Sales, Silhouette Headlight Genuine

Mercedes Benz 350sl Model, 350sl Unavailable wrote Mercedes Benz 350sl Model, 350sl Unavailable
on Fri, May 21 2010 9:10

Pingback from  Mercedes Benz 350sl Model, 350sl Unavailable

Hyundai Tucson V6 Review, 1st Rate 2nd Hand Tucson Thrift Shop wrote Hyundai Tucson V6 Review, 1st Rate 2nd Hand Tucson Thrift Shop
on Fri, May 21 2010 9:16

Pingback from  Hyundai Tucson V6 Review, 1st Rate 2nd Hand Tucson Thrift Shop

2008 Chevrolet Avalanche 2500 L V8, 2005 Chevrolet Avalanche Colors Silver Birch Metallic wrote 2008 Chevrolet Avalanche 2500 L V8, 2005 Chevrolet Avalanche Colors Silver Birch Metallic
on Fri, May 21 2010 9:30

Pingback from  2008 Chevrolet Avalanche 2500 L V8, 2005 Chevrolet Avalanche Colors Silver Birch Metallic

Pb100 Part Particulate, Aftermarket Plymouth Pb100 Van Fuel Pump wrote Pb100 Part Particulate, Aftermarket Plymouth Pb100 Van Fuel Pump
on Fri, May 21 2010 9:52

Pingback from  Pb100 Part Particulate, Aftermarket Plymouth Pb100 Van Fuel Pump

Audio Substitute, Cab Sheet Music Audi wrote Audio Substitute, Cab Sheet Music Audi
on Fri, May 21 2010 9:54

Pingback from  Audio Substitute, Cab Sheet Music Audi

Starwood Mediawiki, Mitsubishi Starion Brake Light wrote Starwood Mediawiki, Mitsubishi Starion Brake Light
on Fri, May 21 2010 10:05

Pingback from  Starwood Mediawiki, Mitsubishi Starion Brake Light

Jeep Eagle Certified Parts Kingwood Tx, Change Jeep Wrangler Headlight Bulb wrote Jeep Eagle Certified Parts Kingwood Tx, Change Jeep Wrangler Headlight Bulb
on Fri, May 21 2010 10:11

Pingback from  Jeep Eagle Certified Parts Kingwood Tx, Change Jeep Wrangler Headlight Bulb

Add a Comment

(required)  
(optional)
(required)  
Remember Me?