---
title: 'DebugPackageInfo'
---

A provider for the binary file and its associated .dwp files, if fission is enabled.If Fission (\{@url https://gcc.gnu.org/wiki/DebugFission\}) is not enabled, the dwp file will be null.

## Members

* [DebugPackageInfo](#DebugPackageInfo)
* [dwp\_file](#dwp_file)
* [stripped\_file](#stripped_file)
* [target\_label](#target_label)
* [to\_json](#to_json)
* [to\_proto](#to_proto)
* [unstripped\_file](#unstripped_file)

## DebugPackageInfo

```
DebugPackageInfo DebugPackageInfo(target_label, stripped_file=None, unstripped_file, dwp_file=None)
```

The `DebugPackageInfo` constructor.

### Parameters

| Parameter | Description |
| --- | --- |
| `target_label` | required  The label for the \*\_binary target |
| `stripped_file` | [File](/versions/7.7.1/rules/lib/builtins/File); or `None`; default is `None`  The stripped file (the explicit ".stripped" target) |
| `unstripped_file` | required  The unstripped file (the default executable target). |
| `dwp_file` | [File](/versions/7.7.1/rules/lib/builtins/File); or `None`; default is `None`  The .dwp file (for fission builds) or null if --fission=no. |

## dwp\_file

```
File DebugPackageInfo.dwp_file
```

Returns the .dwp file (for fission builds) or null if --fission=no.
May return `None`.

## stripped\_file

```
File DebugPackageInfo.stripped_file
```

Returns the stripped file (the explicit ".stripped" target).
May return `None`.

## target\_label

```
Label DebugPackageInfo.target_label
```

Returns the label for the \*\_binary target

## to\_json

```
string DebugPackageInfo.to_json()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
Creates a JSON string from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs, a list of these types or a dictionary with string keys and values of these types. Quotes and new lines in strings are escaped. Examples:

```
struct(key=123).to_json()
# {"key":123}

struct(key=True).to_json()
# {"key":true}

struct(key=[1, 2, 3]).to_json()
# {"key":[1,2,3]}

struct(key='text').to_json()
# {"key":"text"}

struct(key=struct(inner_key='text')).to_json()
# {"key":{"inner_key":"text"}}

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()
# {"key":[{"inner_key":1},{"inner_key":2}]}

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()
# {"key":{"inner_key":{"inner_inner_key":"text"}}}
```

.

Deprecated: instead, use json.encode(x) or json.encode\_indent(x), which work for values other than structs and do not pollute the struct field namespace.

## to\_proto

```
string DebugPackageInfo.to_proto()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
Creates a text message from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs or dicts or lists of these types. Quotes and new lines in strings are escaped. Struct keys are iterated in the sorted order. Examples:

```
struct(key=123).to_proto()
# key: 123

struct(key=True).to_proto()
# key: true

struct(key=[1, 2, 3]).to_proto()
# key: 1
# key: 2
# key: 3

struct(key='text').to_proto()
# key: "text"

struct(key=struct(inner_key='text')).to_proto()
# key {
#   inner_key: "text"
# }

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()
# key {
#   inner_key: 1
# }
# key {
#   inner_key: 2
# }

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()
# key {
#    inner_key {
#     inner_inner_key: "text"
#   }
# }

struct(foo={4: 3, 2: 1}).to_proto()
# foo: {
#   key: 4
#   value: 3
# }
# foo: {
#   key: 2
#   value: 1
# }
```

Deprecated: use proto.encode\_text(x) instead.

## unstripped\_file

```
File DebugPackageInfo.unstripped_file
```

Returns the unstripped file (the default executable target)