Skip to content

Commit b803694

Browse files
Add Image for dynamic analysis using gprof, and valgrind
1 parent 22c4e77 commit b803694

8 files changed

Lines changed: 164 additions & 4 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Images
1616
* __sbuild:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/sbuild/Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/sbuild)
1717
* __sbuild-svf:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/sbuild/svf.Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/sbuild) **Broken**
1818
* __sbuild-cscout:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/sbuild/cscout.Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/sbuild)
19+
* __sbuild-dynamic:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/sbuild/dynamic.Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/sbuild)
1920
* __kafka-svf:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/kafka_sbuild/svf.Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/kafka_sbuild) **Broken**
2021
* __kafka-cscout:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/kafka_sbuild/cscout.Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/kafka_sbuild)
2122
* __kafka-filter-debian:__ [Dockerfile](https://github.com/fasten-project/debian-builder/blob/master/kafka_filter_debian/Dockerfile), [Instructions](https://github.com/fasten-project/debian-builder/tree/master/kafka_filter_debian)

build.sh

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,17 @@ docker build -t sbuild -f Dockerfile .
44
docker tag sbuild schaliasos/sbuild
55
docker build -t sbuild-cscout -f cscout.Dockerfile .
66
docker tag sbuild-cscout schaliasos/sbuild-cscout
7-
docker build -t sbuild-svf -f svf.Dockerfile .
8-
docker tag sbuild-svf schaliasos/sbuild-svf
7+
# docker build -t sbuild-svf -f svf.Dockerfile .
8+
# docker tag sbuild-svf schaliasos/sbuild-svf
9+
docker build -t sbuild-dynamic -f dynamic.Dockerfile .
10+
docker tag sbuild-dynamic schaliasos/sbuild-dynamic
911
cd ../kafka_sbuild
1012
docker build -t kafka-sbuild -f Dockerfile .
1113
docker tag kafka-sbuild schaliasos/kafka-sbuild
1214
docker build -t kafka-cscout -f cscout.Dockerfile .
1315
docker tag kafka-cscout schaliasos/kafka-cscout
14-
docker build -t kafka-svf -f svf.Dockerfile .
15-
docker tag kafka-svf schaliasos/kafka-svf
16+
# docker build -t kafka-svf -f svf.Dockerfile .
17+
# docker tag kafka-svf schaliasos/kafka-svf
1618
cd ../kafka_filter_debian
1719
docker build -t kafka-filter-debian -f Dockerfile .
1820
docker tag kafka-filter-debian schaliasos/kafka-filter-debian

sbuild/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Build
1616
docker build -t sbuild .
1717
docker build -t sbuild-svf -f svf.Dockerfile .
1818
docker build -t sbuild-cscout -f cscout.Dockerfile .
19+
docker build -t sbuild-dynamic -f dynamic.Dockerfile .
1920
```
2021

2122
Run
@@ -62,3 +63,4 @@ Images in Dockerhub
6263
* **sbuild**: `schaliasos/sbuild`
6364
* **sbuild-svf**: `schaliasos/sbuild-svf:latest`
6465
* **sbuild-cscout**: `schaliasos/sbuild-cscout:latest`
66+
* **sbuild-dynamic**: `schaliasos/sbuild-dynamic:latest`

sbuild/config/dynamic/fstab

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# fstab: static file system information for chroots.
2+
# Note that the mount point will be prefixed by the chroot path
3+
# (CHROOT_PATH)
4+
#
5+
# <file system> <mount point> <type> <options> <dump> <pass>
6+
/proc /proc none rw,bind 0 0
7+
/sys /sys none rw,bind 0 0
8+
/dev/pts /dev/pts none rw,bind 0 0
9+
tmpfs /dev/shm tmpfs defaults 0 0
10+
# Mount a large scratch space for the build, so we don't use up
11+
# space on an LVM snapshot of the chroot itself.
12+
/var/lib/sbuild/build /build none rw,bind 0 0
13+
/callgraphs /callgraphs none rw,bind 0 0
14+
/usr/local /usr/local none rw,bind 0 0

sbuild/config/dynamic/sbuildrc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# example for ~/.sbuildrc. (Also see /etc/sbuild/sbuild.conf.) -*- Perl -*-
2+
#
3+
# Default settings are commented out.
4+
# Additional options found in /etc/sbuild/sbuild.conf may be
5+
# overridden here.
6+
7+
8+
$core_depends = [
9+
'build-essential:native',
10+
'fakeroot:native',
11+
'python3',
12+
'python3-pip',
13+
'vim',
14+
'valgrind'
15+
];
16+
17+
$external_commands = {
18+
'post-build-commands' => [],
19+
'chroot-setup-commands' => [],
20+
'starting-build-commands' => [
21+
'analyzer %p'
22+
# '%SBUILD_SHELL'
23+
],
24+
};
25+
26+
# don't remove this, Perl needs it:
27+
1;
28+

sbuild/dynamic.Dockerfile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# vim:set ft=dockerfile:
2+
FROM schaliasos/sbuild:latest
3+
4+
USER root
5+
6+
ENV deps="graphviz libgraphviz-dev valgrind binutils python3 python3-pip"
7+
ENV pip_deps="networkx pydot gprof2dot setuptools pygraphviz"
8+
9+
RUN apt -yqq update && apt -yqq upgrade && apt install -yqq $deps
10+
RUN pip3 install setuptools pygraphviz networkx
11+
12+
WORKDIR /root
13+
14+
# SCRIPT TO RUN TOOLS
15+
COPY ./scripts/base_analyzer /usr/local/bin/base_analyzer
16+
COPY ./scripts/dynamic/analyzer /usr/local/bin/analyzer
17+
COPY ./scripts/dynamic/dot2csv /usr/local/bin/dot2csv
18+
19+
# CONFIG FILES
20+
COPY ./config/dynamic/sbuildrc /root/.sbuildrc
21+
COPY ./config/dynamic/sbuildrc /home/builder/.sbuildrc
22+
COPY ./config/dynamic/fstab /etc/schroot/sbuild/fstab
23+
24+
# DIRECTORY TO SAVE CALL-GRAPHS
25+
run mkdir -p /callgraphs
26+
RUN chown -R builder /callgraphs
27+
RUN chmod o+w /callgraphs/
28+
29+
USER builder
30+
WORKDIR /home/builder

sbuild/scripts/dynamic/analyzer

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
# Parameters
3+
SRC=$1
4+
TOOL='svf'
5+
6+
DIR="${BASH_SOURCE%/*}"
7+
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
8+
. "$DIR/base_analyzer"
9+
10+
prepare_env() {
11+
pip3 install setuptools
12+
pip3 install pydot gprof2dot
13+
}
14+
15+
build() {
16+
printf "\n###Debug: build\n"
17+
echo "tool: dynamic" >> $DEST_PKG/report
18+
DEB_CFLAGS_SET="-fprofile-arcs -pg" DEB_CXXFLAGS_SET="-fprofile-arcs -pg" \
19+
dpkg-buildpackage -b 2> error
20+
cp error $DEST_PKG/build.war
21+
echo "build: success" >> $DEST_PKG/report
22+
}
23+
24+
analyze() {
25+
printf "\n###Debug: analyze\n"
26+
cd $PWD_SRC
27+
for bin in $(find . -type f -executable); do
28+
out=$(basename $bin)
29+
mkdir -p $DEST_PKG/$out
30+
if gprof $bin > profile.out; then
31+
if gprof2dot -f prof -o graph.dot profile.out; then
32+
dot2csv graph.dot $out.gprof.csv -p
33+
cp $out.gprof.csv $DEST_PKG/$out
34+
fi
35+
fi
36+
echo "" > temp123121
37+
echo "#####################$bin##########################"
38+
echo "#####################$out##########################"
39+
valgrind --tool=callgrind --callgrind-out-file=./$out.txt $bin < temp123121
40+
if [ -f $bin.txt ]; then
41+
echo "#####################11111111111111##########################"
42+
if gprof2dot -f callgrind -o graph.dot $out.txt; then
43+
echo "#####################22222222222222##########################"
44+
dot2csv graph.dot $out.callgrind.csv
45+
cp $out.callgrind.csv $DEST_PKG/$out
46+
fi
47+
fi
48+
done
49+
}
50+
51+
main () {
52+
TOOL_DIR="$PWD_SRC/dynamic_data"
53+
init
54+
prepare_env
55+
build
56+
analyze
57+
}
58+
59+
main
60+
61+
exit 0

sbuild/scripts/dynamic/dot2csv

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python3
2+
import argparse
3+
import csv
4+
import networkx as nx
5+
6+
if __name__ == "__main__":
7+
parser = argparse.ArgumentParser()
8+
parser.add_argument("input_dot")
9+
parser.add_argument("output_csv")
10+
parser.add_argument(
11+
"-p", "--profile", action='store_true', help="Gprof profile"
12+
)
13+
args = parser.parse_args()
14+
g = nx.drawing.nx_pydot.read_dot(args.input_dot)
15+
with open(args.output_csv, 'w') as f:
16+
writer = csv.writer(f)
17+
edges = g.edges.data(False)
18+
if args.profile:
19+
nodes = {k: v.split('\\')[0].replace('"', '')
20+
for k, v in nx.get_node_attributes(g, 'label').items()}
21+
edges = [(nodes[e[0]], nodes[e[1]]) for e in edges]
22+
writer.writerows(edges)

0 commit comments

Comments
 (0)