> ## C/C++ Instrumentation

> Fetch the complete documentation index at: https://antithesis.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

---

## Prerequisites

Instrumentation for C and C++ is packaged with the [C++ SDK](/docs/reference/sdk/cpp/). Instrumentation is supported by the header file `antithesis_instrumentation.h`. This file must be included in one, and only one translation unit at link time. Coverage instrumentation requires Clang 13 or higher, and either C++ 11 or higher or C89 or higher.

We recommended that you include the instrumentation header in the file where you define the `main` function, as follows:

```cpp
#include "antithesis_instrumentation.h"
```

> **Note**
>
> If you are unable to meet the requirements of our C/C++ instrumentation, perhaps because you use an older version of Clang or are unable to include a header file, then you can try our [legacy instrumentation approach](/docs/reference/sdk/cpp/old_c_instrumentation/). This approach does not require a modern Clang or a header file, but it will instead require you to provide a shared object at link-time.

## Build Requirements

Your instrumented binary must be built with libraries and dependencies that it will use at runtime.

Add the following compile flag:

```
-fsanitize-coverage=trace-pc-guard -g
```

And add the following link flag:

```
--build-id
```

> **Note**
>
> LLVM-instrumented binaries must have GNU build ids for symbolization to work. As long as you use the --build-id link flag above, you'll be fine.

If your build process includes a single compile/link step, then add both compile and link flags with the following:

```
-fsanitize-coverage=trace-pc-guard -g -Wl,--build-id
```

> **Note**
>
> We recommend the use of `-g` but it is not necessary. It will provide more detailed information when bugs are found, which may make debugging easier.

## Validation

To confirm that the instrumentation process was successful, you can run the command `nm` to list all the symbols in a binary, and then `grep` the string *"antithesis\_load\_libvoidstar"*.

```shell frame="none"
$ nm client_binary | grep "antithesis_load_libvoidstar"
T antithesis_load_libvoidstar
```

Notice the **"T"** character in the previous code block: it means the symbol is in the text (code) section.

If this does not work you probably failed to include the header file.

## Symbolization

The LLVM compiler infrastructure will output debug symbols in the [DWARF](https://en.wikipedia.org/wiki/DWARF) format. They could be separate debug info or just the original unstripped binary. These files should be symlinked (or moved) into a directory named `/symbols` in the root of the [appropriate container image](/docs/reference/instrumentation/coverage_instrumentation/#symbolization).

## Help

[Contact us](/company/contact/) if you need help with this.
