Products

Jinx

A jinx is a curse of bad luck. You stub your toe. You spill your coffee. It rains on your day off. Traffic lights are always red. Everything goes wrong in the worst possible way.

Jinx is a software quality tool for gaining insight into multithreaded programs. Under the covers, Jinx varies the relative order in which threads access shared memory. Since threading issues are order-dependencies, Jinx uses information it gleans while re-ordering thread accesses to give you insight into how your code performs, including potential data races, concurrency bugs, and, most importantly, root-cause analysis of concurrency errors. Because Jinx exposes issues that don't arise frequently in normal operation, we like to say that it makes buggy multithreaded programs unlucky, as if they were jinxed.

With Jinx, your organization can permit its developers to exploit the full power of multi-core processors. Jinx provides several benefits, including:

You can count
on Jinx

Jinx provides deep and accurate insight into the operation of your multi-threaded programs. When Jinx identifies a bug, you can be sure it’s real. There are no false positives with Jinx, saving you a significant amount of time in both finding a bug and determining its veracity. You can count on the results you get from using Jinx.

Jinx works
the way you do

It doesn’t require you to change anything about your software development methodology. It’s integrated with Visual Studio and command line tools of Windows and Linux and can be easily introduced as part of every continuous integration cycle.

Jinx is easy to use
and to get started

It takes about five minutes to download the product, install it, and begin using it. There’s no hassle, no fuss, and no complex configuration required.

 

 

"Identifying concurrency errors is increasingly important, because systems may run happily in testing or under many other conditions and then suddenly fail. This usually leaves little useful information for organizations to use to track down the problem or reproduce the defect. What is key about [Jinx] is that it discovers why the bug occurs, which is critical in this type of operation."

Thomas Murphy, Research Director, Gartner Group

 

 

About Multi-Core Applications

Almost every application built today employs multiple threads of execution so that the logic of these programs can run concurrently. These types of applications often introduce more errors because when application logic runs in parallel, portions of the overall application execute independently of one another. As a result, the application may exhibit different behavior based on how quickly or slowly these independent threads execute. For example, let’s say you have two threads in an application. The first time the application runs, the first thread may execute faster than the second thread and the application will conclude with an acceptable result. However, the second time the application executes, the same first thread may execute slower due to a variety of internal events, such as the operating system scheduling one processor over another, when one processor has less inhibited access to system memory, and so on, and, as a result, the application will conclude with a different result or even crash altogether.

Moreover, even though a developer or tester may witness a concurrency bug, pinpointing its exact cause can often be difficult. Indeed, the manifestation of the bug may often involve the interaction between potentially widely-separated bits of code, and even then only when several independent internal events (such as the ones listed above) happen to coincide within narrow timing windows. To complicate matters, when multi-threaded applications run in multi-core environments, these independent threads may execute on independent processors, making pinpointing the exact cause of the bug significantly more difficult.

In some cases, developers can spend weeks or months hunting down the root cause of concurrency bugs, as the application may perform differently and, therefore, the bugs may manifest themselves differently based on the type of instrumentation used to detect them, the type or even specific piece of hardware on which the application is run, the time of day, and any number of external factors. Obviously, developers and testers would much rather spend their time innovating and delivering software rather than tracking down bugs.

 

 

 

 

"This is an absolutely priceless gift for developers writing multi-threaded code."

Electronic Arts

Why Do You Need Jinx?

 

Saves You Time
Jinx makes bugs happen faster earlier in the software lifecycle, enabling you to focus on delivering better software. Now, you can spend time delivering value to your customers instead of tracking down elusive bugs.
Saves You Money
Jinx reduces the amount of resources required to find bugs in your software. And, bugs caught earlier in the software development lifecycle cost less to fix.
Works the Way You Do
Jinx requires no changes to your development tools and testing practices and, instead, plugs right into them. Visual Studio, command line tools, debuggers, load testing tools. You name it, Jinx works with it.

 

"Every computer – even the cheapest laptop –is now a parallel processing engine. To fully exploit this potential, all applications must be multithreaded. However, there is a real shortage of quality tools to test and debug concurrency in parallel applications. Jinx is the right tool at just the right time."

John Barr, 451 Group

Makes You More Productive
Jinx works under the covers and amplifies the effectiveness of your development and testing methodology. You do everything the way you always have, just do it with Jinx turned on and let us find your bugs.
Improves Security
Jinx uncovers concurrency errors, a potentially dangerous security attack vector for which the industry is woefully unprepared. Reduce the risk of shipping mutli-threaded software that could be used for malicious purposes.
Gives You More Confidence
Jinx quickly finds bugs that can stay hidden for weeks or months, threatening your reputation and customers. With Jinx, there are no false positives. When Jinx finds a bug, it's definitely a bug.
 

 

"Our software is highly parallelized and searching for concurrency bugs has always been a tedious manual process. Now, we simply enable Jinx on our developers’ desktops and find bugs earlier in the development process."

Pixetell

 

 

When to Use Jinx

Jinx is easy to use and integrate with your existing development workflow. As such, it is applicable at many points throughout the software development lifecycle:

  • During the develop-debug development cycle. Developers writing multi-threaded software can use Jinx during their day-to-day development tasks and ensure that their modules and applications are built using good development hygiene. Jinx will identify bugs as they are written, ensuring that the developer who created the bug has an opportunity to fix it before passing it on to the rest of the team.
  • During automated testing. Jinx can be easily integrated with your continuous integration, regression testing, unit testing, and nightly builds. Jinx will accelerate the rate at which bugs are found with minimal intrusion into the overall development process.
  • During load, stress, and fuzz testing. Jinx can't magically identify bugs. It works by simulating thread timings as an application is executed. Load, stress, and fuzz testing exercise software in multiple ways. Jinx can work under the covers during these periods to simulate thread interleavings and accelerate the rate at which bugs are found.
  • During system acceptance testing. Prior to deployment, Jinx can be run on the application and the actual deployment hardware to identify bugs that may only be found when the entire system is put together for the first time.
  • As part of normal security testing. Jinx can identify concurrency errors, a potential insidious attack vector, during the execution of security testing suites and scripts.
  • When you need insurance. If the application you're building is mission-critical, you owe it to your client or customers to use Jinx and flush out potentially catastrophic concurrency errors and identify data races.

 

 

What Jinx Does For Your Multi-Threaded Code

Jinx makes your code "unlucky"
by proactively causing it to crash
so you can investigate why it did so.

 

Corensic builds software quality tools that enable businesses to safely exploit the full power of multi-core processors to deliver ThreadSafe systems. Using Corensic’s award-winning products, businesses can find bugs faster during development, communicate more efficiently about bugs found during testing, and validate full system stacks prior to deployment.

Jinx is a software quality tool that exposes hard-to-find concurrency bugs at design-time, saving developers and QA professionals time and improving application reliability. Jinx examines your software and intelligently selects slices of execution time within which to probe deeper for bugs. Within each time slice, Jinx evaluates numerous possibilities for the timing of how various threads within an application interact with one another and execute, and chooses a particular schedule of thread execution that is most likely to cause a bug. As a result, Jinx makes your code “unlucky” by proactively causing it to crash so that you can investigate why it did so.

Jinx helps you understand how threads are communicating when a program error occurs. When a program crash is detected Jinx will not only stop the crashing thread at the problematic source code line (as all debugging tools will do), but it stops all other threads in your application at the earliest point in time when the bug would still have occurred, so that you can obtain an accurate picture of the state of your application when a bug was caused (as no other debugging tool can do).

 

Jinx gives you a photo of
the "crime scene" (the application state)
at the moment the concurrency bug occurred.
We call this feature SmartStop.

 

In the forensics of evaluating bugs in multi-core applications, the first step is knowing that bugs, or “crimes” are occurring. Jinx also gives you a photo of the “crime scene” (the application state) at the moment the concurrency bug occurred. We call this feature SmartStop. One of the hardest challenges with debugging parallel code is that you often only see one side of the problem. You know which thread detected incorrect program state or wandered off on a bad pointer. But you don’t see which thread actually corrupted program state or wrote that bad pointer value to begin with. SmartStop lets you see this thread at that exact point.

Jinx ordinarily lies dormant below the operating system. However, when applications register with the debugger to be tested, Jinx takes control of your operating system. Execution of the machine then proceeds in two phases: a simulation phase and a replay phase. In the simulation phase, Jinx examines your software and intelligently selects slices of execution time within which to probe deeper for bugs. Within each time slice, Jinx evaluates numerous possibilities of for the timing of how various threads within an application interact with one another and execute, and chooses a particular schedule of thread execution that is most likely to cause a bug.

In the replay phase, Jinx then takes the possibility that is most likely to cause a bug and makes it happen on the actual operating system environment. If a bug occurs, Jinx notifies you, either through the IDE or the command line interface. As a result, Jinx makes your code “unlucky” by proactively causing it to crash so that you can investigate why it did so.

 

Jinx enables you to get more insight into potential errors
in your software and the efficacy of
your concurrency testing processes.
We call this feature Reports.

 

In addition to accelerating bugs and stopping them in the debugger intelligently via SmartStop, Jinx Reports can provide information about buggy and likely-buggy code in your application. Jinx Reports allows use of SmartStop in test automation environments where use of a debugger may not be practical. It provides greater insight into how concurrent code gets executed, and likely errors in it. Jinx Reports also fills a major gap in determining the efficacy of concurrency testing by enabling the construction of a concurrent coverage metric that describes how much coverage particular interleavings of threads have received.

Jinx Reports creates a shareable artifact that organizes potential errors in your software, each of which is referred to as an event. These events include assertion failures (which are, by definition, errors), NULL pointer dereferences (which are usually errors), machine level events such as General Protection Faults, and data races. Jinx Reports also offers a fast and effective race detector that is based on Jinx's simulation/exploration process (explained above) and leverages SmartStop to provide more detailed information about potential errors. The data races contained in a Jinx Report are often valid errors, though not always. The Jinx Reports race detector can also analyze code running in kernel mode, making it the world's first and only kernel-mode race detector. Jinx Reports can be stored and included in bug reports after, for example, a test automation harness is run on your software. Consult the Jinx documentation Wiki for more technical information about the contents of a Jinx Report.

 

Most development and test organizations are familiar with the concept of code coverage. Code coverage gives you an understanding of which lines of code have been exercised by your unit tests. It is a useful metric that can help you ensure that your software is being adequately tested. Unfortunately, code coverage alone is insufficient in the world of parallel development. Concurrent programs don't always exhibit the same behavior from one execution to the next. For that reason, Jinx Reports also provides the world's first and only concurrency coverage analysis tool. Jinx Reports can give you insight into how much of your code is being "Jinxed," and, therefore, being tested for concurrency errors. This can help you make sure that you are exercising your software sufficiently so that Jinx can detect potential concurrency errors.

 

 

 

"Our software teams have found that by using Jinx in our software development and testing, we have been able to find concurrency software defects in minutes instead of the 12 hours that would have been required with conventional testing."

Citrix Systems

 

 

How Jinx Identifies Bugs

No algorithm can definitively tell if a program state is buggy (such a determination is “undecidable”), but it can look for clues in the system state that strongly suggest an application error has occurred.

For example, programs that de-reference a null pointer, trigger a general protection fault, or fire a programmer-directed assert are usually not operating as intended.

Because Jinx observes and manipulates communications at the memory level, it is not necessary to use any specific threads package with it. Jinx will find bugs in Windows Native Threads, OpenMP, pthreads, and lock-free data structures. Jinx deterministically controls the interleaving of workloads across processor cores, focusing on shared memory interactions. Developers can also flag particular code regions of interest. Jinx dynamically builds a set of potential interleavings (i.e., alternate eventualities, or execution scenarios, that will occur under some future set of conditions) that are most likely to result in concurrency faults, and quickly tests those execution paths to surface concurrency problems including deadlocks, race conditions, and atomicity violations.

 

 

 

"Any time a programming model is introduced, developers need robust tooling support for learning, writing, debugging and optimizing their code to make use of it. This is particularly true for parallel programming, which adds a set of new variables to the equation."

S. Somasegar, VP of Developer Division, Microsoft Corporation

 

 

You Can Count on Jinx

Unlike other tools, Jinx does not find bugs if there are none to be found. This is an important feature of Jinx. If the application being tested crashes when Jinx is installed, it is because there is a real honest-to-goodness bug in that application. There are no false positives with Jinx. All bugs Jinx finds during testing are bugs that, if ignored, will eventually appear during deployment.

 

 

"Jinx is a vital tool to enable software developers to thrive 
rather than merely survive in an increasingly parallel environment."

Cantor Fitzgerald

 

 

Jinx Works the Way You Do

 

Jinx fits perfectly into your ordinary development and test workflow

 

All of the same compilers, libraries, debuggers, and tools work with Jinx. Jinx for Windows integrates directly into Visual Studio 2005, Visual Studio 2008, or Visual Studio 2010 and both Jinx for Windows and Jinx for Linux can also be used from the command line. Jinx amplifies the effectiveness of software testing tools, such as HP LoadRunner and Codenomicon. And Jinx can be used to quickly verify that there are no glaring conflicts in elements of system stacks, including operating systems, device drivers, and applications.

 

 

Jinx integrates with your system automatically,
using the VMX (Intel) or SVM (AMD) hardware extensions,
running below the operating system
on your development or testing machine.

 

Jinx does not require the use or installation of a virtual environment or guest operating system. Jinx is quickly installed using the Windows Installer or common Linux package installation tools, and remains entirely dormant until a program referencing Jinx is executing. At that point, Jinx takes over the execution of the entire operating environment, deterministically managing execution of program sections most likely to cause concurrency faults. Jinx installs easily and uninstalls completely.

 

 

Jinx does not require changes to any of your existing work processes,
tooling, or your computing environment

Jinx works with and complements other debugging and development tools, including Microsoft Visual Studio, Intel Parallel Studio, Coverity Thread Analyzer, and others. In the simplest use case, you just enable Jinx for your entire system and then bugs in your concurrent programs start to occur (if they are there). That's ideal for doing system verification or acceptance testing. If you like (and we suggest) you can modify your programs to include simple commands that help Jinx focus its debugging strength on your application instead of the entire system. That's ideal for the times when you know there's a bug in code you have access to (and are able to modify). Lastly, you can instruct Jinx to focus its testing on a single application binary. That's ideal for use with load, stress, or fuzz testing, particularly in circumstances where you have access to an application, but not its code.

 

 

 

 

"Corensic support of parallel programming through both multicore parallelism and Intel Core processors is welcome news for software developers."

James Reinders, Chief Evangelist, Intel Software Products

 

Features & Benefits

Jinx includes a number of features to help you quickly and definitively uncover hard-to-find bugs in your applications:

Find bugs fast.
Get insight into your bugs.
Communicate information
about your bugs.

 

 

 

System Requirements

  • Jinx requires a system with VMX (Intel) or SVM (AMD) virtualization extensions.
  • Jinx for Windows is currently supported on 64-bit Windows Vista, Windows 7, and Windows Server 2008 platforms, and 32-bit Windows Server 2003, Windows Server 2008, Windows XP, Windows Vista, Windows 7 platforms.
  • Jinx for Linux supports the following Linux distributions:
    • CentOS 5.3 and 5.5
    • Ubuntu 9.10 and 10.04
    • Fedora 11 and 12
    • Debian 5.0 (lenny)
  • 2GB RAM
  • At least 100MB of free hard drive space.

For more detailed information on system requirements, consult the Jinx documentation.

Pricing and Licensing Terms

Jinx is available for Windows and Linux and is currently generally available. Jinx is priced at $1999 USD per user. Other licensing terms, including shared machine and test lab licensing, are available.

Contact Us at sales@corensic.com for pricing terms or download the 14-day trial now.

 

 

 

"Debugging multicore code is one of the most interesting, nontrivial problems software designers face today. Problems that only show up on Mondays with a full moon and no silver bullets available can devastate humanity, and problems with concurrent code similarly devastate programmers because they walk right through most normal debugging tools."

Don Dingee, Embedded Computing Magazine

 

 
);