Outline:
- Problem
- Inadequate Solutions
- A Better Way
- Step 1: Create the pdb2xml Database
- Step 2: Query the pdb2xml Database Using the IL Offset
- Step 3: Have Your Application Log the IL Offset
- Download the source code and demo
- Conclusion
----
Problem
Enterprise applications will inevitably throw exceptions. The ideal thing to do with these exceptions is to log them, send the results back to the appropriate developer, and then have that developer fix the code. Part of the problem is that the production (i.e. release-mode) logs are often missing helpful information that developers take for granted in debug mode, like the source file and line number.
Inadequate Solutions
One approach is to just settle and not get the extra info. For easy bugs it is sufficient to just have the callstack (from calling the exception’s ToString method) and some extra arbitrary parameters from a custom logger. But what about the bugs that aren't easy?
Another approach is to just dump the PDB files into your production environment. If you put the PDB (program database) files right next to the corresponding DLLs, then .Net will automatically generate the file and line numbers for you in every exception callstack. Recall that the PDB files contain information to reverse-engineer your code, such that a debugger could step through it. So you almost never want to give those files out to the public. That means this approach only works for applications you host, such as an ASP.Net app. But even still, it could be a security risk, or your IT department or deployment team may have a policy against it.
A Better Way
Looking at these inadequate solutions, it makes us appreciate the ideal solution, which would full the two criteria:
- Provide you the PDB info like file name and line number
- Not require you to ship or deploy the PDB files.
.Net allows you to do this. The “trick” is to get the “IL Offset” and use that to lookup in the PDB files for the exact info you need. Recall that all .Net code gets compiled to Intermediate Language (IL); therefore the IL Offset is just the line number in the IL code. The PDB maps the IL code to your source code. So, this approach has three main steps:
- Create the pdb2xml database, this maps your IL to your source code.
- Query the pdb2xml database using the IL Offset.
- Have your application log the IL Offset.
This approach fulfills our criteria, so let’s explore it in more detail.
Step 1: Create the pdb2xml Database
The PDB files are not plain text, so they’re hard to work with for most people. However, the MSDN debugging team wrote a free tool that lets you convert the PDB files to XML (special thanks to Mike Stall for helping me better understand Pdb2Xml), such that you can easily look up info in them. You can download the “pdb2xml” converter tool from MSDN: http://www.microsoft.com/downloads/details.aspx?familyid=38449a42-6b7a-4e28-80ce-c55645ab1310&displaylang=en
When running the pdb2xml tool, it creates an xml file like so:
<symbols file="TestLoggerApp.Core.dll">
<files>
<file id="1" name="C:\Temp\MyApp.Core\Class1.cs" ... />
<file id="2" name="C:\Temp\MyApp.Core\Class2.cs" ... />
files>
<methods>
<method name="MyApp.Core.Class3.Start3" token="0x6000002">
<sequencepoints total="1">
<entry il_offset="0x4" start_row="17" start_column="7"
end_row="17" end_column="54" file_ref="1" />
sequencepoints>
<locals />
method>
…
This lists all the files, classes, and method involved. Each method can be looked up via the unique token. The
In order to get the exact
- Xml file to lookup at, where each xml file maps to a .Net assembly.
- Method, which we can obtain from the token. The method name is just extra info for convenience.
- IL Offset, which is stored as a hex value.
Because real application usually have many assemblies, ideally we could just point to a bin directory full of pdb files, and have a tool (like an automated build) dynamically generate all the corresponding xml files. We can write a wrapper for pdb2xml to do this.
The biggest issue when writing such a wrapper tool is that pdb2xml, which uses Reflection to dynamically load the assemblies, will get choked up when loading one assembly which contains a class that inherits a class in a different assembly. The easiest way to solve this is to just copy all the targeted assemblies (that you want to generate your xml files for) to the bin of pdb2xml. You could use the ReflectionOnlyAssemblyResolve event to handle resolution errors, but that will provide other problems because you need a physical file, but the event properties only give you the assembly name. While most of the time they’re the same, it will be one more problem to solve when they’re not.
Pdb2xml should handle a variety of cases – assemblies with strong names, third-party references, compiled in release mode, or files that are even several MB big.
ASP.Net applications are a little trickier. Starting with .Net 2.0, ASP allows another compilation model, where every page can get compiled to its own DLL. The easiest way to collect all these DLLs is to run the aspnet_compiler.exe tool, which outputs all the assemblies (and PDBs) to the web’s bin directory. You can read about the aspnet_compiler here: http://msdn.microsoft.com/en-us/library/ms229863(VS.80).aspx, or its MSBuild task equivalent: http://msdn.microsoft.com/en-us/library/ms164291.aspx.
Note that when using the aspnet_compiler, you need to include the debug ‘-d’ switch in order to generate the PDB files. A sample call (ignoring the line breaks) could look like:
aspnet_compiler.exe
-v /my_virtualDir
-p C:\Projects\MyWeb\
-f
-d
-fixednames C:\Projects\precompiledweb\MyWeb\
For convenience, I’ve attached a sample tool - PdbHelper.Cmd.Test (from the download) which will mass-generate these xml files for you. This solves the first step – converting the pdb files to an xml format that we can then query. You can now put those xml files anywhere you want, such as on a shared developer machine.
Step 2: Query the pdb2xml Database Using the IL Offset
Given an xml data island, we can easily query that data. The only thing we need is a key. In this case, we can have the application’s logger generate an xml snippet which some tool or process can then scan for and use it to lookup in the pdb2xml database. Let’s say that our logger gave us the following xml snippet (we’ll discuss how in the next step):
<ILExceptionData>
<Point module='TestLoggerApp.Core.dll' classFull='TestLoggerApp.Core.Class2'
methodName='Start2' methodSignature='Int32 Start2(System.String, Boolean)'
methodToken='0x6000005' ILOffset='11' />
...
ILExceptionData>
For each line in the stack trace, our this XML snippet contains a
- module – the .Net module, which directly maps to an xml file.
- methodToken – the token, which uniquely identifies the method
- ILOffset – The line, in IL, that threw the exception. Our logger wrote this as decimal, but we can easily convert it to hex.
These values are just included for convenience:
- classFull – the full, namespace-qualified, name of the class
- methodName – the actual method’s name
- methodSignature – the signature, to help troubleshoot overloaded methods
Given this xml snippet, we can have any tool or process consume it. In this case, I wrote a sample WinForm app (PdbHelper.Gui, from the Download) that takes a directory to the pdb2xml database, as well as the Xml Snippet, and performs the lookup. The logic is straightforward, perhaps the only catch is the IL Offset is not always exact; therefore if there is no exact match in the pdb2xml file, round down – i.e. find the previous entry node.
So, the developer could run this app, and it returns the file, line, and column.
While this is a manual GUI app, the logic could be automate for a console app, or other process.
Step 3: Have Your Application Log the IL Offset
The last step is to generate the Xml snippet. Given any Exception, you can use the System.Diagnostics.StackTrace object to determine the IL Offset, method, and module. You first need to create a new StackTrace object using the current Exception. You can then cycle through each StackFrame, getting the relevant data. This logic could be abstracted to its own assembly such that you could easily re-use it across all your applications.
public static string CreateXmlLog(Exception ex)
{
try
{
//Get offset:
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(ex, true);
System.Diagnostics.StackFrame[] asf = st.GetFrames();
StringBuilder sb = new StringBuilder();
sb.Append("
int[] aint = new int[asf.Length];
for (int i = 0; i < aint.Length; i++)
{
System.Diagnostics.StackFrame sf = asf[i];
sb.Append(string.Format("
sf.GetMethod().Name, sf.GetILOffset(), sf.GetMethod().Module, sf.GetMethod().ReflectedType.FullName,
sf.GetMethod().ToString(), GetILHexLookup(sf.GetMethod().MetadataToken)));
}
sb.Append("\r\n");
return sb.ToString();
}
catch (Exception ex2)
{
return "Error in creating ILExceptionData: " + ex2.ToString();
}
}
private static string GetILHexLookup(int intILOffsetDec)
{
return "0x" + intILOffsetDec.ToString("X").ToLower();
}
Download the source code and demo
You can download the complete source code, and an automated demo here.
The package has the following folders:
- BuildScripts - automated scripts to run everything. This is useful if you wan to integrate the PdbHelper into your own processes.
- mdbg - the pdb2xml application, with the compiled binaries. This was downloaded from MSDN.
- PdbHelper.Cmd.Test - the command line tool to create all the xml files from pdb (this wraps the MSDN pdb2xml code)
- PdbHelper.Core - reusable logic that the command line and GUI both use.
- PdbHelper.Gui - the windows GUI to easily look up debugging info in the pdb-generated xml files.
- PdbHelper.Logger - a reusable logger component that takes in an Exception and returns an xml snippet containing the IL offset.
- TestLoggerApp - a test application to demonstrate all this.
There's not much code to all of this, so you could just reverse engineer it all. But to make it easy, go to the BuildScripts folder and you're see 4 bat files, numbered in order:
- 0_DeleteBins.bat - cleans up things to "reset" everything (delete bin and obj folders). This is optional, but useful when developing.
- 1_CompileFramework.bat - compile the PdbHelper framework (you could just open the solution in VS)
- 2_RunTestApp.bat - runs the test console app, whose whole purpose is to throw an exception, display the IL offset xml snippet, and then write it out to a file for easy use.
- 3_LookupException.bat - Run the windows GUI app. This passes in command line arguments to automatically populate the xml directory and the IL offset snippet generated in the previous step. You just need to click the "Lookup" button, and it should show you the debug info.
Several of these scripts call MSBuild to run certain tasks. Also, by default, this dumps the pdb2xml files in C:\Temp\pdb2xml.
Conclusion
Using these three steps allows an application to log additional info, from which we can then query the pdb files to find the source file and line number. This extra info can be very useful when debugging, helping to reduce the total cost of ownership.
Sorry to comment on a old post, but I'm getting a 403 Forbidden while trying to download the PDBHelper sample tool.
ReplyDeleteCould you make it available again?
Hi, Great.. Tutorial is just awesome..It is really helpful for a newbie like me.. I am a regular follower of your blog. Really very informative post you shared here. Kindly keep blogging. If anyone wants to become a .Net developer learn from .Net Core Training in Chennai. or learn thru .Net Core Training in Chennai. Nowadays Dot Net has tons of job opportunities on various vertical industry.
Deleteor Es6 Training in Chennai. Nowadays JavaScript has tons of job opportunities on various vertical industry.
IEEE Final Year projects Project Centers in Chennai are consistently sought after. Final Year Students Projects take a shot at them to improve their aptitudes. IEEE Final Year project centers ground for all fragments of CSE & IT engineers hoping to assemble.Final Year Projects for CSE
DeleteSpring Framework has already made serious inroads as an integrated technology stack for building user-facing applications. Spring Framework Corporate TRaining .
Specifically, Spring Framework provides various tasks are geared around preparing data for further analysis and visualization. Spring Training in Chennai
The Angular Training covers a wide range of topics including Angular Directives, Angular Services, and Angular programmability.Angular Training
Thanks for your interest. I may have lots the attachement (and pictures) when migrating my site to a new domain a year ago. Sorry for the inconvenience.
ReplyDeleteThank you for this article. Very instructive.
ReplyDeleteThis article is very educational. I'm sad that the sample is gone, but thank you.
ReplyDeleteThe supported way to do what you were trying to achieve is to use MiniDumpWriteDump (http://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx). It produces a mini dump you can open in any debugger (VS, WinDbg, etc.) and gives you all the information you request. No tricks required.
ReplyDeleteI found your blog while searching for the updates, I am happy to be here. Very useful content and also easily understandable providing..
ReplyDeleteBelieve me I did wrote an post about tutorials for beginners with reference of your blog.
Selenium training in bangalore
Selenium training in Chennai
Selenium training in Bangalore
Selenium training in Pune
Selenium Online training
The article is so informative. This is more helpful for our
ReplyDeletesoftware testing training and placement
best selenium online training
software testing training courses
Thanks for sharing.
Great Blog!!!
ReplyDeleteDigital Marketing Course Training Institute in Chennai
Big Data Course Training Institute in Chennai
Data Science Course Training Institute in Chennai
Android Training Institute in Chennai
AngularJS Training Institute in Chennai
Great post!
ReplyDeleteThanks for sharing this list!
It helps me a lot finding a relevant blog in my niche!
Java Training in Chennai
Java Training in Coimbatore
Java Training in Bangalore
Nice blog....waiting for next update....
ReplyDeleteStruts Training in Chennai
Best Struts Training in Chennai
Best Struts Training institute in Chennai
struts Training in OMR
struts Training in Porur
Wordpress Training in Chennai
SAS Training in Chennai
Spring Training in Chennai
Photoshop Classes in Chennai
DOT NET Training in Chennai
Thank you for this awesome blog. You are giving a professional touch to your content. It makes your article worth reading. Looking forward to learn more from you.
ReplyDeleteAutomation Anywhere Training in Chennai
Automation Anywhere course in Chennai
AWS Training in Chennai
Azure Training in Chennai
Cloud Computing Training in Chennai
Automation Anywhere Training in Vadapalani
Automation anywhere training in Guindy
Automation anywhere training in Thiruvanmiyur
The blog which you have shared is more creative... Waiting for your upcoming data...
ReplyDeletePython Training in Chennai
Python course in Chennai
Python Training Institute in Chennai
Python Training course
Python training in Guindy
Python Training in Tambaram
Hadoop Training in Chennai
Big data training in chennai
SEO training in chennai
JAVA Training in Chennai
Excellent post and it is really useful for most of the freshers.
ReplyDeleteIonic Training in Chennai
Ionic framework training
Data Analytics Courses in Chennai
IELTS Coaching centre in Chennai
Japanese Language Classes in Chennai
TOEFL Classes in Chennai
Ionic Training in Porur
Ionic Training in OMR
thanks for your details it's very use for my works web design company in velachery
ReplyDeleteI have been reading all your blogs regularly..I admit, this is one of the best blogs I have read till date. Great going.. Waiting for the next...
ReplyDeleteSpoken English Classes in Chennai
Spoken English Class in Chennai
Spoken English in Chennai
IELTS Training in Chennai
IELTS Chennai
Best English Speaking Classes in Mumbai
Spoken English Classes in Mumbai
IELTS Mumbai
IELTS Coaching in Anna Nagar
Spoken English Class in T Nagar
I want to thank for sharing this blog, really great and informative. Share more stuff like this.
ReplyDeleteEthical Hacking course in Chennai
Ethical Hacking Training in Chennai
Hacking course
ccna course in Chennai
Salesforce Training in Chennai
Angular 7 Training in Chennai
Web Designing course in Chennai
Ethical Hacking course in Thiruvanmiyur
Ethical Hacking course in Porur
Ethical Hacking course in Adyar
Very nice post with lots of information. Thanks for sharing this updates.
ReplyDeleteAngularjs Training in Chennai
Angularjs Training in Bangalore
Angularjs Training institute in Chennai
Angularjs course in Chennai
angular course in bangalore
Angular 4 Training in Chennai
salesforce course in bangalore
Big Data Training in Coimbatore
I really liked and I got some ideas about this technology...
ReplyDeletekeep updating more for us... thanks for shared useful blog..
Data Analytics Courses in Chennai
Big Data Analytics Training
german classes
Best IELTS Coaching in Chennai
learn Japanese in Chennai
content writing course in chennai
spanish coaching in chennai
Data Analytics Courses in Porur
Data Analytics Courses in Anna Nagar
Really a awesome blog for the freshers. Thanks for posting the information.
ReplyDeletebusiness card price in india
online paper bag printing india
desktop rental in chennai
macbook for rent in chennai
online company registration in india
company registration consultants in india
Excellent blog thanks for sharing Take care of all your search engine optimization SEO, graphic design, logo creation, social media marketing and digital branding need at one stop - Adhuntt Media. Customer satisfaction and service is our priority - We tread that fine line between projecting your visions into tangible reality! Why wait when you can begin your digital marketing journey with us right now at Adhuntt Media.
ReplyDeletedigital marketing company in chennai
Nice blog thanks for sharing Try out different styles and bring your backyard back to life with the best garden service in Chennai - Karuna Nursery Gardens. Right from landscaping, terrace gardening and corporate services and renting plants, we do it all.
ReplyDeleteplant nursery in chennai
Excellent blog thanks for sharing Pixies beauty Shop is the best place to buy cosmetics in Chennai. With thousands of premium imported brands to choose from, you’ll never run out of lipstick again. And don’t forget about the best offers and value they provide.
ReplyDeleteCosmetics Shop in Chennai
Good Post! Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging.
ReplyDeleteeTechno Soft Solutions is a leading training institute for all kind of the Oracle Training in Bangalore with real-time experienced trainers with 100% Placement Assistance.
Having read this I believed it was extremely technology informative. I appreciate you finding the time and energy to put this content together. I once again find myself personally spending a significant amount of time both reading and leaving comments. But so what, it was still worth it!
ReplyDeleteIts a wonderful post and very helpful, thanks for all this information. You are including better information regarding this topic in an effective way.
ReplyDeleteDot Net Training in Chennai | Dot Net Training in anna nagar | Dot Net Training in omr | Dot Net Training in porur | Dot Net Training in tambaram | Dot Net Training in velachery
When introducing another application or game, you get a rundown of authorizations that you award the product.먹튀
ReplyDeleteit was extremely technology informative. I appreciate you finding the time and energy.
ReplyDeletePython Training in Chennai
Python Training in Training
Python Training in Bangalore
Python Hyderabad
Python Training in Coimbatore
Your good knowledge and kindness in playing with all the pieces were very useful. I don’t know what I would have done if I had not encountered such a step like this.
ReplyDeletedata science training in chennai
data science training in tambaram
android training in chennai
android training in tambaram
devops training in chennai
devops training in tambaram
artificial intelligence training in chennai
artificial intelligence training in tambaram
Nice blog. I finally found great post here Very interesting to read this article and very pleased to find this site. Great work!
ReplyDeleteCyber Security Training Course in Chennai | Certification | Cyber Security Online Training Course | Ethical Hacking Training Course in Chennai | Certification | Ethical Hacking Online Training Course | CCNA Training Course in Chennai | Certification | CCNA Online Training Course | RPA Robotic Process Automation Training Course in Chennai | Certification | RPA Training Course Chennai | SEO Training in Chennai | Certification | SEO Online Training Course
I found your blog while searching for the updates, I am happy to be here. Very useful content and also easily understandable providing..
ReplyDeletejava training in chennai
java training in omr
aws training in chennai
aws training in omr
python training in chennai
python training in omr
selenium training in chennai
selenium training in omr
Building an Access information base typically begins with chipping away at the tables first and getting the right sorts of informational index in your application from the beginning saving you a ton of time and cerebral pains later when computing and alluding to numeric qualities somewhere else.visit website
ReplyDeletethanks for your information really good and very nice The Best Result Driven Digital Marketing Agency in Chennai
ReplyDeleteAmazing article, Really useful information to all, Keep sharing more useful updates.
ReplyDeletedata science skills
latest new technologies
ccna job opportunities
courses with guaranteed jobs
cyber security interview questions pdf
java interview questions and answers for freshers
ReplyDeleteThank you .very interesting to read
https://www.blogger.com/comment.g?blogID=4370421825573178711&postID=6128219949629439185&page=2&token=1615013177957
good blogging
ReplyDeletePython Training in chennai | Python Classes in Chennai
The writer has outdone himself this time. It is not at all enough; the website is also utmost perfect. I will never forget to visit your site again and again. Convert pdf to word
ReplyDeleteYou have performed a great job on this article. It’s very precise and highly qualitative. You have even managed to make it readable and easy to read. You have some real writing talent. Thank you so much. convert pdf to png
ReplyDeleteAwesome post Python Training in Chennai
ReplyDeleteVery efficiently written information. It will be beneficial to anybody who utilizes it, including me. Keep up the good work. For sure i will check out more posts. This site seems to get a good amount of visitors. video upload
ReplyDeleteAdvances in interchanges and innovation have carried with it an off-shoot marvel that has significantly affected the manner in which people and organizations interface and manage one another. pefile
ReplyDeleteAdvances in interchanges and innovation have carried with it an off-shoot marvel that has significantly affected the manner in which people and organizations interface and manage one another.pe file header
ReplyDeleteNice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and it has same topic together with your article. Thanks, nice share. 먹튀사이트
ReplyDeleteHi there! Nice stuff, do keep me posted when you post again something like this! 먹튀검증
ReplyDeleteAn fascinating discussion is value comment. I think that it is best to write extra on this matter, it won’t be a taboo topic however generally people are not enough to talk on such topics. To the next. Cheers แทงบอล
ReplyDeleteWithout fail, your writing style is top professional; even your website also looks amazing thank you for posting. 스포츠토토
ReplyDeletei am always looking for some free stuffs over the internet. there are also some companies which gives free samples. แทงบอล
ReplyDeleteHello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work. esa letter
ReplyDeleteWonderful blog! I found it while surfing around on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I’ve been trying for a while but I never seem to get there! Appreciate it. 토토사이트
ReplyDeleteNice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and it has same topic together with your article. Thanks, nice share. 메이저사이트
ReplyDeleteSomeone Sometimes with visits your blog regularly and recommended it in my experience to read as well. The way of writing is excellent and also the content is top-notch. Thanks for that insight you provide the readers! cheapest web hosting indiaonohosting
ReplyDeletei am always looking for some free stuffs over the internet. there are also some companies which gives free samples. 카지노사이트검증
ReplyDeleteI really like your writing style, great information, thankyou for posting. 토토사이트
ReplyDeleteHi there! Nice post! Please tell us when I will see a follow up! 먹튀검증
ReplyDeleteNice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and it has same topic together with your article. Thanks, nice share. click here
ReplyDeleteEfficiently written information. It will be profitable to anybody who utilizes it, counting me. Keep up the good work. For certain I will review out more posts day in and day out. Watergardens at Canberra Showflat
ReplyDeleteThanks for sharing the post.. parents are worlds best person in each lives of individual..they need or must succeed to sustain needs of the family. apkpure
ReplyDeleteKeep up the good work , I read few posts on this web site and I conceive that your blog is very interesting and has sets of fantastic information. 토토커뮤니티
ReplyDeletei am always looking for some free stuffs over the internet. there are also some companies which gives free samples. 먹튀검증
ReplyDeleteno deposit bonus forex 2021 - takipçi satın al - takipçi satın al - takipçi satın al - takipcialdim.com/tiktok-takipci-satin-al/ - instagram beğeni satın al - instagram beğeni satın al - google haritalara yer ekleme - btcturk - tiktok izlenme satın al - sms onay - youtube izlenme satın al - google haritalara yer ekleme - no deposit bonus forex 2021 - tiktok jeton hilesi - tiktok beğeni satın al - binance - takipçi satın al - uc satın al - finanspedia.com - sms onay - sms onay - tiktok takipçi satın al - tiktok beğeni satın al - twitter takipçi satın al - trend topic satın al - youtube abone satın al - instagram beğeni satın al - tiktok beğeni satın al - twitter takipçi satın al - trend topic satın al - youtube abone satın al - instagram beğeni satın al - tiktok takipçi satın al - tiktok beğeni satın al - twitter takipçi satın al - trend topic satın al - youtube abone satın al - instagram beğeni satın al - perde modelleri - instagram takipçi satın al - instagram takipçi satın al - cami avizesi - marsbahis - betboo
ReplyDeleteYou delivered such an impressive piece to read, giving every subject enlightenment for us to gain information. Thanks for sharing such information with us due to which my several concepts have been cleared. source
ReplyDeleteIt is truly a well-researched content and excellent wording. I got so engaged in this material that I couldn’t wait reading. I am impressed with your work and skill. Thanks. BizOp
ReplyDeletePretty good post. I have just stumbled upon your blog and enjoyed reading your blog posts very much. I am looking for new posts to get more precious info. Big thanks for the useful info. poker88 asia
ReplyDeleteEvery weekend i used to pay a quick visit this web site, because i want enjoyment, for the reason that this this
ReplyDeleteweb page conations really nice funny data too.
Feel free to visit my blog - 부산오피
You understand your projects stand out of the crowd. There is something unique about them. It seems to me all of them are brilliant. small capsule lift for home price in india
ReplyDeleteinstagram takipçi satın al
ReplyDeleteinstagram takipçi satın al
takipçi satın al
takipçi satın al
instagram takipçi satın al
takipçi satın al
instagram takipçi satın al
aşk kitapları
tiktok takipçi satın al
instagram beğeni satın al
youtube abone satın al
twitter takipçi satın al
tiktok beğeni satın al
tiktok izlenme satın al
twitter takipçi satın al
tiktok takipçi satın al
youtube abone satın al
tiktok beğeni satın al
instagram beğeni satın al
trend topic satın al
trend topic satın al
youtube abone satın al
beğeni satın al
tiktok izlenme satın al
sms onay
youtube izlenme satın al
tiktok beğeni satın al
sms onay
sms onay
perde modelleri
instagram takipçi satın al
takipçi satın al
tiktok jeton hilesi
pubg uc satın al
sultanbet
marsbahis
betboo
betboo
betboo
Thanks for the blog filled with so many information. Stopping by your blog helped me to get what I was looking for. Now my task has become as easy as ABC. 토토사이트
ReplyDeleteHi there! Nice post! Please tell us when I will see a follow up! Belgravia Ace Showflat
ReplyDeleteHi there! Nice stuff, do keep me posted when you post again something like this! 토토사이트
ReplyDeleteI really like your writing style, great information, thankyou for posting. 안전놀이터
ReplyDeleteThankyou for this wondrous post, I am glad I observed this website on yahoo. 토토사이트
ReplyDeleteCool stuff you have got and you keep update all of us. 안전놀이터
ReplyDeleteIf more people that write articles involved themselves with writing great content like you, more readers would be interested in their writings. I have learned too many things from your article. 릴게임
ReplyDeleteGreat post but I was wondering if you could write a little more on this subject? I’d be very thankful if you could elaborate a little bit further. Thanks in advance! 릴게임
ReplyDeleteYou understand your projects stand out of the crowd. There is something unique about them. It seems to me all of them are brilliant. 온라인릴게임
ReplyDeleteI have a hard time describing my thoughts on content, but I really felt I should here. Your article is really great. I like the way you wrote this information. 온라인릴게임
ReplyDeleteGood artcile, but it would be better if in future you can share more about this subject. Keep posting. 안전놀이터
ReplyDeleteThat is the excellent mindset, nonetheless is just not help to make every sence whatsoever preaching about that mather. Virtually any method many thanks in addition to i had endeavor to promote your own article in to delicius nevertheless it is apparently a dilemma using your information sites can you please recheck the idea. thanks once more. check it
ReplyDeleteAn interesting dialogue is price comment. I feel that it is best to write more on this matter, it may not be a taboo topic however usually individuals are not enough to talk on such topics. To the next. Cheers. 먹튀검증사이트
ReplyDeleteAn fascinating discussion is value comment. I think that it is best to write extra on this matter, it won’t be a taboo topic however generally people are not enough to talk on such topics. To the next. Cheers 먹튀검증커뮤니티
ReplyDeleteYou have outdone yourself this time. It is probably the best, most short step by step guide that I have ever seen. 먹튀검증
ReplyDeletetakipçi satın al
ReplyDeletetakipçi satın al
takipçi satın al
Someone Sometimes with visits your blog regularly and recommended it in my experience to read as well. The way of writing is excellent and also the content is top-notch. Thanks for that insight you provide the readers! best site to buy youtube views
ReplyDeleteHi there! Nice stuff, do keep me posted when you post again something like this! research transcription services
ReplyDeletehttps://salsabeelahmedandco.com/
ReplyDeleteVery Informative and useful... Keep it up the great work. I really appreciate your post.
https://salsabeelahmedandco.com/company-registration-in-bangalore/
https://salsabeelahmedandco.com/ca-firms-in-bangalore/
https://salsabeelahmedandco.com/accounting-services-in-bangalore/
https://salsabeelahmedandco.com/gst-consultants-in-bangalore/
https://salsabeelahmedandco.com/public-limited-company/
https://salsabeelahmedandco.com/private-limited-company-in-india/
https://salsabeelahmedandco.com/one-person-company-in-india/
https://salsabeelahmedandco.com/partnership-firm-in-bangalore/
https://salsabeelahmedandco.com/limited-liability-partnership-llp/
An interesting dialogue is price comment. I feel that it is best to write more on this matter, it may not be a taboo topic however usually individuals are not enough to talk on such topics. To the next. Cheers. 먹튀검증
ReplyDeletemarsbahis
ReplyDeletebetboo
sultanbet
marsbahis
betboo
sultanbet
Today, I was just browsing along and came upon your blog. Just wanted to say good blog and this article helped me a lot, due to which I have found exactly I was looking. 토토커뮤니티
ReplyDeleteI found your this post while searching for information about blog-related research ... It's a good post .. keep posting and updating information. 88카
ReplyDeleteYour website is really cool and this is a great inspiring article. 88카
ReplyDeleteCGood website! I truly love how it is easy on my eyes it is. I am wondering how I might be notified whenever a new post has been made. I have subscribed to your RSS which may do the trick? Have a great day! 먹튀검증
ReplyDeleteWith liposuction, the surgeon can remove stubborn fat deposits, improve your physical appearance by using contouring procedures to give you pleasing curves in all the right places. my explanation
ReplyDeleteRSJ is at the top of our game when it comes to tax-minimization strategies for asset growth, protection and transfer. We have always known that something was missing from traditional estate planning for high-net-worth families. click over here now
ReplyDeleteMecanica utilizes the latest in cutting edge tools, technologies and methodologies in the areas of crash reconstruction and Event Data Recorders for documenting and analyzing accidents and related EDR data. pop over to this site
ReplyDeleteAt Inovi, we’re committed to achieving the highest success rates while providing personalized care to our patients. Our Houston location offers expert care and is home to our state-of-the-art embryology lab. view publisher site
ReplyDeleteThe Toto site legally operated in Korea is Batman Toto. Except for Batman Toto, all Toto sites are private Toto, and you can see that there are a lot of private Toto sites that do not have restrictions on the amount of bets and winnings, so it can be seen that there has been a rapid increase in recent years 먹튀검증
ReplyDeleteThank you a bunch for sharing this with all of us you actually realize what you are talking about! Bookmarked. Please also seek advice from my site =). We could have a hyperlink change contract between us! daftar sbobet
ReplyDeleteThank you so much as you have been willing to share information with us. We will forever admire all you have done here because you have made my work as easy as ABC. textbook solutions
ReplyDeleteYou there, this is really good post here. Thanks for taking the time to post such valuable information. Quality content is what always gets the visitors coming. safe deposit box price
ReplyDeleteดูหนังออนไลน์ ดูหนัง หนัง hd ซีรีย์เกาหลี ซีรีย์จีน ดูการ์ตูน ทีวีออนไลน์ ดูหนังออนไลน์ ฟรี nungsub หนังชนโรง Netflik ดูหนังออนไลน์ฟรี เว็บดูหนัง ดูฟรีไม่มีสะดุด ดูหนังออนไลน์
ReplyDeleteYou there, this is really good post here. Thanks for taking the time to post such valuable information. Quality content is what always gets the visitors coming. iqama expiry
ReplyDeleteThanks for picking out the time to discuss this, I feel great about it and love studying more on this topic. It is extremely helpful for me. Thanks for such a valuable help again. 팔팔카
ReplyDeletePositive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include. renta car beograd
ReplyDeleteThe training is to develop strategies to build up banking product lineup with features for cooperatives and SMEs. Workshop provides the edge you need to develop banking products or services. This training provides you with UAE Banks SMEs product and comparative study of SMEs product lineup. Case studies of SMEs product shall be discussed in the training. Gain skills to develop product based on market trend and customer focused for increasing your chances of market success. Banking Strategies for SME
ReplyDeleteThis is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. Dallas homicide defense lawyer
ReplyDeleteIt is a great website.. The Design looks very good.. Keep working like that!. KissAnime Alternatives
ReplyDeleteI really like your writing style, great information, thankyou for posting. 토토사이트 먹튀검증
ReplyDeleteWow, this is really interesting reading. I am glad I found this and got to read it. Great job on this content. I like it. Dentitox Pro Reviews – After reading this, you should buy Dentitox Pro
ReplyDeleteI’m going to read this. I’ll be sure to come back. thanks for sharing. and also This article gives the light in which we can observe the reality. this is very nice one and gives indepth information. thanks for this nice article... nex777 login
ReplyDeletei never know the use of adobe shadow until i saw this post. thank you for this! this is very helpful. 파워볼게임
ReplyDeleteVery informative post! There is a lot of information here that can help any business get started with a successful social networking campaign. 토토사이트
ReplyDeleteI am very happy to discover your post as it will become on top in my collection of favorite blogs to visit. Film streaming
ReplyDeleteLiposuction should never be considered an alternative to a healthy lifestyle, it is one of the steps that can get you to a better version of yourself through fat reduction. Get More Info
ReplyDeleteI wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post. บาคาร่าออนไลน์
ReplyDeleteExcellent post. I was reviewing this blog continuously, and I am impressed! Extremely helpful information especially this page. Thank you and good luck. คาสิโนออนไลน์
ReplyDeleteI'm glad I found this web site, I couldn't find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, im always look for people to check out my web site. nex777
ReplyDeleteIt proved to be Very helpful to me and I am sure to all the commentators here! https://linklist.bio/togel
ReplyDeleteNice to be visiting your blog once more, it has been months for me. Well this article that ive been waited for therefore long. i want this article to finish my assignment within the faculty, and it has same topic together with your article. Thanks, nice share. 대전마사지
ReplyDeleteI have read your article, it is very informative and helpful for me.I admire the valuable information you offer in your articles. Thanks for posting it.. oxycontin
ReplyDeleteThank you for this fascinating post, I am happy I observed this website on Google. Not just content, in fact, the whole site is fantastic. ฉีดฟิลเลอร์หน้าผาก อันตราย
ReplyDeleteI appreciate everything you have added to my knowledge base.Admiring the time and effort you put into your blog and detailed information you offer.Thanks. สิวอักเสบไม่มีหัว
ReplyDeleteYour company must be able to articulate your value proposition and address the challenges your prospects face on a daily basis in their business. If you can communicate how your products or services can help solve their pain points and help their business to grow, thrive, and sustain, your lead generation efforts will resonate with prospects in a meaningful way. best seller
ReplyDeleteOnly strive to mention one's content can be as incredible. This clarity with your post is superb! Thanks a lot, hundreds of along with you should go on the pleasurable get the job done. textbook answers
ReplyDeleteIt is my first visit to your blog, and I am very impressed with the articles that you serve. Give adequate knowledge for me. Thank you for sharing useful material. I will be back for the more great post. textbook answers
ReplyDeleteI wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post. 바둑이게임
ReplyDeleteGreat post, you have pointed out some fantastic points , I likewise think this s a very wonderful website. 토토사이트
ReplyDeleteGood post but I was wondering if you could write a litte more on this subject? I’d be very thankful if you could elaborate a little bit further. Appreciate it! 먹튀검증
ReplyDeleteVery efficiently written information. It will be beneficial to anybody who utilizes it, including me. Keep up the good work. For sure i will check out more posts. This site seems to get a good amount of visitors. https://www.toryburchoutlet.org/
ReplyDeleteThe way you write, you are really a professional blogger. masteranime
ReplyDeleteYour content is nothing short of bright in many forms. I think this is friendly and eye-opening material. I have gotten so many ideas from your blog. Thank you so much. https://yesmovies.agency
ReplyDeleteNice post. I was checking constantly this blog and I’m impressed! Extremely useful info specially the last part I care for such information a lot. I was seeking this certain info for a long time. Thank you and good luck. https://gomovies.group
ReplyDeleteNice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. https://myvumoo.com
ReplyDeleteNice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. https://couchtuner.rest
ReplyDeleteNice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. https://solar-movies.one
ReplyDeleteThis is my first time i visit here. I found so many interesting stuff in your blog especially its discussion. 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 https://movieninja.live
ReplyDeletePositive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include. https://the123movies.site
ReplyDeleteThis is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. https://primewirewebsite.site
ReplyDeleteI am unable to read articles online very often, but I’m glad I did today. This is very well written and your points are well-expressed. Please, don’t ever stop writing. https://la-123movies.one
ReplyDeleteHello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work. 먹튀검증
ReplyDeleteI have read your blog it is very helpful for me. I want to say thanks to you. I have bookmark your site for future updates. 먹튀검증
ReplyDeleteWhat a well written and compassionate article. I found your thoughts and wisdom to be encouraging and helpful. Cbd massage oil
ReplyDeletePretty nice post. I just stumbled upon your weblog and wanted to say that I have really enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again soon! 먹튀폴리스
ReplyDeleteYou have done a great job on this article. It’s very readable and highly intelligent. You have even managed to make it understandable and easy to read. You have some real writing talent. Thank you. 토토사이트
ReplyDeleteI was looking at some of your posts on this website and I conceive this web site is really instructive! Keep putting up.. 대전건마
ReplyDeleteThankyou for this wondrous post, I am glad I observed this website on yahoo. 대전건마
ReplyDeleteThanks For Best Useful Information: STEP institute Interior Design Courses.https://www.iadm.edu.pk/academics/faculty-of-art-design/interior-design-course/
ReplyDeleteThanks For Best Useful Information: STEP institute Interior Design Courses. https://www.iadm.edu.pk/academics/faculty-of-art-design/interior-design-course/
ReplyDeleteYou have a good point here!I totally agree with what you have said!!Thanks for sharing your views...hope more people will read this article!!! 바둑이게임
ReplyDeleteI am definitely enjoying your website. You definitely have some great insight and great stories. https://sites.google.com/view/buy-twitch-followers/
ReplyDeleteFor many people this is the best solution here see how to do it. 토토사이트
ReplyDeleteThis is certainly as well a really good posting we seriously experienced looking through. It is far from on a daily basis we have risk to check out a little something. clothing sample makers uk
ReplyDeleteI wanted to thank you for this excellent read!! I definitely loved every little bit of it. I have you bookmarked your site to check out the new stuff you post. 먹튀검증
ReplyDelete바카라사이트
ReplyDeleteHello I am so delighted I located your blog, This is my website and it has been very helpful. Thank you for your hard work to make this site.
I sincerely hope that you will be able to see such advanced content. I absolutely love your blog and find many of your posts exactly what I was looking for.
Please visit my website and give your opinion.
I found your this post while searching for some related information on blog search...Its a good post..keep posting and update the information. detective barcelona
ReplyDeleteI wanted to thank you for this excellent read!! I definitely loved every little bit of it. I have you bookmarked your site to check out the new stuff you post. 토토사이트
ReplyDeleteYou make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers. 토토사이트
ReplyDeleteI’ve been meditating on the identical issue personally recently. Pleased to see another person on the same wavelength! Nice article. 먹튀검증
ReplyDeleteYou’ve got some interesting points in this article. I would have never considered any of these if I didn’t come across this. Thanks!. 꽁머니
ReplyDeleteSome truly wonderful work on behalf of the owner of this internet site , perfectly great articles . 꽁머니 커뮤니티
ReplyDeleteThe way you write, you are really a professional blogger. latest news in urdu
ReplyDeleteVery efficiently written information. It will be beneficial to anybody who utilizes it, including me. Keep up the good work. For sure i will check out more posts. This site seems to get a good amount of visitors. 토토사이트
ReplyDeletei was just browsing along and came upon your blog. just wanted to say good blog and this article really helped me. 토토사이트
ReplyDeleteThis blog website is pretty cool! How was it made ! 먹튀검증
ReplyDeleteHey There. I found your blog using msn. This is a very well written article. I’ll be sure to bookmark it and come back to read more of your useful info. Thanks for the post. I’ll definitely return. 토토사이트
ReplyDeleteI really thank you for the valuable info on this great subject and look forward to more great posts. Thanks a lot for enjoying this beauty article with me. I am appreciating it very much! Looking forward to another great article. Good luck to the author! All the best! 먹튀검증
ReplyDeleteThank you so much for such a well-written article. It’s full of insightful information. Your point of view is the best among many without fail.For certain, It is one of the best blogs in my opinion. Nagaland State Lottery
ReplyDeleteWhat a thrilling post, you have pointed out some excellent points, I as well believe this is a superb website. I have planned to visit it again and again. 토토사이트
ReplyDeleteWow, What an Outstanding post. I found this too much informatics. It is what I was seeking for. I would like to recommend you that please keep sharing such type of info.If possible, Thanks. 먹튀검증
ReplyDeleteGood day! I just want to give a huge thumbs up for the great info you might have here on this post. I will be coming again to your weblog for extra soon. 스포츠중계
ReplyDeleteYou’ve got some interesting points in this article. I would have never considered any of these if I didn’t come across this. Thanks!. ufabet
ReplyDeleteGreat article Lot's of information to Read...Great Man Keep Posting and update to People..Thanks slotxo
ReplyDeletehi was just seeing if you minded a comment. i like your website and the thme you picked is super. I will be back. 오피사이트
ReplyDeleteI consider something really interesting about your site so I bookmarked . Giày jordan 1 low
ReplyDeleteIf more people that write articles involved themselves with writing great content like you, more readers would be interested in their writings. I have learned too many things from your article. 오피사이트
ReplyDeleteThis article was written by a real thinking writer. I agree many of the with the solid points made by the writer. I’ll be back. superslot
ReplyDeleteAll your hard work is much appreciated. Nobody can stop to admire you. Lots of appreciation. แทงบอล
ReplyDeleteYou know your projects stand out of the herd. There is something special about them. It seems to me all of them are really brilliant! ไมเซล่า
ReplyDeleteThis is certainly as well a really good posting we seriously experienced looking through. It is far from on a daily basis we have risk to check out a little something.protechrise
ReplyDeletePositive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include. 먹튀폴리스
ReplyDeleteThis site seems to inspire me a lot. Thank you so much for organizing and providing this quality information in an easy to understand way. I think that a healthy era of big data can be maintained only when such high-quality information is continuously produced. And I, too, are working hard to organize and provide such high-quality information. It would be nice to come in once and get information.
ReplyDeleteAlso visit my site:온라인카지노
I am very much pleased with the contents you have mentioned. I wanted to thank you for this great article. 먹튀검증
ReplyDeleteTahir termite service – TTS® is the largest independently owned pest control company in Lahore, Pakistan.Pest Control Lahore
ReplyDeleteWhen you move to a new place or buy your own Bedsheet online Pakistan.Bedsheet online Pakistan
ReplyDeletehis is the excellent blog page for anyone who wants to know about this theme. You recognize a lot its virtually difficult to argue with you (not that I really would want…HaHa). You absolutely put a fresh spin on a subject matter thats been published about for many years. Wonderful things, just excellent! 토토커뮤니티
ReplyDeletebirthday wishes for mother in law Birthday is the perfect occasion to show your love to mother in law. You may check our best collection of birthday wishes for her.
ReplyDeleteKbc official website list for information online like Kaun Banega Crorepati Lucky draw Winners 2022.Rana prtap phone number kbc 2022
ReplyDeleteSalon is now proud to offer complete range of hair styling, facial skincare treatments and body hair removal services for men.Cost To Dye Hair At Salon
ReplyDeleteThank you ever so for you blog article. Thanks Again. Really Great.
ReplyDeleteshare files
เกมบาคาร่าออนไลน์ เกมสล็อตออนไลน์ SA Game1688 Lucabet168
ReplyDeleteLuckyNiki บาคาร่า
There is noticeably a bundle to know about this. I assume you made certain nice points in features also . Cab in Airdrie
ReplyDeleteEnjoying a luxurious lifestyle begins today. Life is too short to possibly be spent on things that are not beneficial. https://www.buyyoutubeviewsindia.in/youtube-marketing/
ReplyDeleteIt very well may be a little one, several hundred dollars however it isn't zero. They likewise require prospecting and conversing with individuals to fabricate a group and procure extra pay. That organization showcasing implies. https://www.buyyoutubesubscribers.in/
ReplyDeleteThis is very appealing, however , it is very important that will mouse click on the connection: Canada Visa for Quebec
ReplyDeleteIt is a fantastic post – immense clear and easy to understand. I am also holding out for the sharks too that made me laugh. start a credit card processing business
ReplyDeleteNice post mate, keep up the great work, just shared this with my friendz online file share
ReplyDeleteThere is noticeably a bundle to know about this. I assume you made certain nice points in features also . Carstairs cab airport
ReplyDeleteNice post. I was checking constantly this blog and I’m impressed! Extremely useful info specially the last part I care for such information a lot. I was seeking this certain info for a long time. Thank you and good luck.collapsed sewer line
ReplyDeletePretty nice post. I just stumbled upon your weblog and wanted to say that I have really enjoyed browsing your blog posts. After all I’ll be subscribing to your feed and I hope you write again soon! North American Bancard ISO
ReplyDeleteyou will need support or suggestions, write me privately.
ReplyDeleteI interested in your implementation/use case.
the best kera4d
Togel2win