diff --git a/.gitignore b/.gitignore index 702599e..511f7f4 100644 --- a/.gitignore +++ b/.gitignore @@ -84,32 +84,3 @@ /systemtap-4.8~pre16594741g5bdc37b9.tar.gz /systemtap-4.8~pre16650659g6a096a7d.tar.gz /systemtap-4.8.tar.gz -/systemtap-4.9.tar.gz -/systemtap-5.0~pre16885197g6b17715f.tar.gz -/systemtap-5.0~pre16885234gd98d6c2d.tar.gz -/systemtap-5.0~pre16890184ge891a37e.tar.gz -/systemtap-5.0~pre16891249ge891a37e.tar.gz -/systemtap-5.0~pre16958465gca71442b.tar.gz -/systemtap-5.0.tar.gz -/systemtap-5.1~pre17056120g2ccc0c4c.tar.gz -/systemtap-5.1~pre17056139g6c0b92b3.tar.gz -/systemtap-5.1~pre17059382g67086c54.tar.gz -/systemtap-5.1~pre17060399gb6abf4bd.tar.gz -/systemtap-5.1~pre17062114g2604d135.tar.gz -/systemtap-5.1~pre17062192g5fd8daba.tar.gz -/systemtap-5.1.tar.gz -/systemtap-5.1~pre17206206ge48abca5.tar.gz -/systemtap-5.2~pre17206355g1a07290a.tar.gz -/systemtap-5.2~pre17224323g98d1ea34.tar.gz -/systemtap-5.2~pre17250223gd07e4284.tar.gz -/systemtap-5.2~pre17277956g0b7f6722.tar.gz -/systemtap-5.2~pre17283218gc5774e18.tar.gz -/systemtap-5.2.tar.gz -/systemtap-5.2~pre17373420g1e894ff0.tar.gz -/systemtap-5.3~pre17373422g9a48fbea.tar.gz -/systemtap-5.3~pre17373794g3efe129d.tar.gz -/systemtap-5.3~pre17373816g7a71d34b.tar.gz -/systemtap-5.3.tar.gz -/systemtap-5.4~pre17585473g1fe4178d.tar.gz -/systemtap-5.4~pre17585496g86ab88eb.tar.gz -/systemtap-5.4.tar.gz diff --git a/gating.yaml b/gating.yaml index a2c8282..ff1fcc6 100644 --- a/gating.yaml +++ b/gating.yaml @@ -1,15 +1,7 @@ --- !Policy product_versions: - fedora-* -decision_contexts: [bodhi_update_push_testing] -subject_type: koji_build -rules: - - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} - - !PassingTestCaseRule {test_case_name: baseos-qe.koji-build.scratch-build.validation} ---- !Policy -product_versions: - - fedora-* -decision_contexts: [bodhi_update_push_stable] +decision_context: bodhi_update_push_stable subject_type: koji_build rules: - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} diff --git a/plans/ci.fmf b/plans/ci.fmf index 7009e4e..95afd8d 100644 --- a/plans/ci.fmf +++ b/plans/ci.fmf @@ -1,12 +1,12 @@ summary: CI Gating Plan discover: - how: fmf - url: https://src.fedoraproject.org/tests/systemtap-gating.git - ref: main - directory: tests + how: fmf + directory: tests + filter: 'tier: 1' prepare: - - name: prepare - how: shell - script: ./plans/prepare.sh + how: install + exclude: + - glibc-headers-x86 + - glibc-headers-s390 execute: - how: tmt + how: tmt diff --git a/plans/ci/prepare/prepare.fmf b/plans/ci/prepare/prepare.fmf new file mode 100755 index 0000000..23e61d1 --- /dev/null +++ b/plans/ci/prepare/prepare.fmf @@ -0,0 +1,7 @@ +summary: Setup task +prepare: + script: ./plans/ci/prepare/prepare.sh +recommend: +- koji +- bind-utils +- avahi-tools diff --git a/plans/prepare.sh b/plans/ci/prepare/prepare.sh similarity index 82% rename from plans/prepare.sh rename to plans/ci/prepare/prepare.sh index dfce543..368ea84 100755 --- a/plans/prepare.sh +++ b/plans/ci/prepare/prepare.sh @@ -1,9 +1,12 @@ #!/bin/bash +export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS" +export DEBUGINFOD_TIMEOUT=300 + # On Rawhide, the running kernel packages won't probably be avail in # configured repos. Debuginfo isn't a problem, we access that using # the debuginfod. -__fedora_install_deps () +__install_deps () { TMPD=$(mktemp -d) pushd $TMPD @@ -17,12 +20,8 @@ __fedora_install_deps () set -xe -source /etc/os-release - # Install needed packages -if [ "$ID" == "fedora" ]; then - stap-prep || __fedora_install_deps -fi +stap-prep || __install_deps stap-prep # Report installed packages diff --git a/rhbz2230079.patch b/rhbz2230079.patch new file mode 100644 index 0000000..0a4fe5e --- /dev/null +++ b/rhbz2230079.patch @@ -0,0 +1,30 @@ +commit ff265fa1ed86b85e021ec0f16a28ab48c237414a +Author: Yichun Zhang (agentzh) +Date: Sat May 6 15:21:14 2023 -0700 + + PR30405: stapkp_init(): we should not disable preemption around the kallsyms_on_each_symbol() call + +diff --git a/runtime/linux/kprobes.c b/runtime/linux/kprobes.c +index 09f0e0665..1875092c5 100644 +--- a/runtime/linux/kprobes.c ++++ b/runtime/linux/kprobes.c +@@ -763,9 +763,7 @@ stapkp_init(struct stap_kprobe_probe *probes, + #ifdef STAPCONF_MODULE_MUTEX + mutex_lock(&module_mutex); + #endif +- preempt_disable(); + kallsyms_on_each_symbol(stapkp_symbol_callback, &sd); +- preempt_enable(); + #ifdef STAPCONF_MODULE_MUTEX + mutex_unlock(&module_mutex); + #endif +@@ -835,9 +833,7 @@ stapkp_refresh(const char *modname, + #ifdef STAPCONF_MODULE_MUTEX + mutex_lock(&module_mutex); + #endif +- preempt_disable(); + kallsyms_on_each_symbol(stapkp_symbol_callback, &sd); +- preempt_enable(); + #ifdef STAPCONF_MODULE_MUTEX + mutex_unlock(&module_mutex); + #endif diff --git a/rhbz2230079a.patch b/rhbz2230079a.patch new file mode 100644 index 0000000..e03aef7 --- /dev/null +++ b/rhbz2230079a.patch @@ -0,0 +1,216 @@ +commit 33fae2d0107fb6166b4eac3fdffd277829849ab0 +Author: Martin Cermak +Date: Fri Jun 2 23:28:07 2023 +0200 + + PR30415: conflicting types for ‘kallsyms_on_each_symbol’ + +diff --git a/runtime/linux/kprobes.c b/runtime/linux/kprobes.c +index 1875092c5..6b30f2c52 100644 +--- a/runtime/linux/kprobes.c ++++ b/runtime/linux/kprobes.c +@@ -28,6 +28,9 @@ extern void *_stp_kallsyms_on_each_symbol; + #endif + #endif + ++// No export check and gates. This one seems simply like a non-export. ++extern void *_stp_module_kallsyms_on_each_symbol; ++ + #if defined(STAPCONF_KALLSYMS_ON_EACH_SYMBOL) && defined(STAPCONF_KALLSYMS_ON_EACH_SYMBOL_EXPORTED) + #define USE_KALLSYMS_ON_EACH_SYMBOL (1) + #elif defined(STAPCONF_KALLSYMS_ON_EACH_SYMBOL) +@@ -684,7 +687,7 @@ struct stapkp_symbol_data { + + + static int +-stapkp_symbol_callback(void *data, const char *name, ++__stapkp_symbol_callback(void *data, const char *name, + struct module *mod, unsigned long addr) + { + struct stapkp_symbol_data *sd = data; +@@ -733,6 +736,19 @@ stapkp_symbol_callback(void *data, const char *name, + return 0; + } + ++static int ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0) ++stapkp_symbol_callback(void *data, const char *name, ++ unsigned long addr) ++{ ++ struct module *mod = NULL; ++#else ++stapkp_symbol_callback(void *data, const char *name, ++ struct module *mod, unsigned long addr) ++{ ++#endif ++ return __stapkp_symbol_callback(data, name, mod, addr); ++} + + static int + stapkp_init(struct stap_kprobe_probe *probes, +@@ -764,6 +780,11 @@ stapkp_init(struct stap_kprobe_probe *probes, + mutex_lock(&module_mutex); + #endif + kallsyms_on_each_symbol(stapkp_symbol_callback, &sd); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) ++ module_kallsyms_on_each_symbol(sd.modname, stapkp_symbol_callback, &sd); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5,12,0) ++ module_kallsyms_on_each_symbol(stapkp_symbol_callback, &sd); ++#endif + #ifdef STAPCONF_MODULE_MUTEX + mutex_unlock(&module_mutex); + #endif +@@ -834,6 +855,11 @@ stapkp_refresh(const char *modname, + mutex_lock(&module_mutex); + #endif + kallsyms_on_each_symbol(stapkp_symbol_callback, &sd); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) ++ module_kallsyms_on_each_symbol(sd.modname, stapkp_symbol_callback, &sd); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5,12,0) ++ module_kallsyms_on_each_symbol(stapkp_symbol_callback, &sd); ++#endif + #ifdef STAPCONF_MODULE_MUTEX + mutex_unlock(&module_mutex); + #endif +diff --git a/runtime/linux/runtime.h b/runtime/linux/runtime.h +index 86d64fd0d..f7b3cdcf0 100644 +--- a/runtime/linux/runtime.h ++++ b/runtime/linux/runtime.h +@@ -221,11 +221,15 @@ static void *_stp_kallsyms_lookup_name; + #ifndef CONFIG_PPC64 + #define STAPCONF_KALLSYMS_ON_EACH_SYMBOL + #if !defined(STAPCONF_KALLSYMS_ON_EACH_SYMBOL_EXPORTED) +-// XXX Should not be static, since it is linked into kprobes.c. +-static void *_stp_kallsyms_on_each_symbol; ++// Not static, since it is linked into kprobes.c: ++void *_stp_kallsyms_on_each_symbol; + #endif + #endif + ++// No export check and gates. This one seems simply like a non-export. ++// Not static, since it is linked into kprobes.c: ++void *_stp_module_kallsyms_on_each_symbol; ++ + // PR13489, inode-uprobes sometimes lacks the necessary SYMBOL_EXPORT's. + #if !defined(STAPCONF_TASK_USER_REGSET_VIEW_EXPORTED) + static void *kallsyms_task_user_regset_view; +diff --git a/runtime/sym.c b/runtime/sym.c +index fc81ac5e8..29171b45f 100644 +--- a/runtime/sym.c ++++ b/runtime/sym.c +@@ -1155,9 +1155,15 @@ unsigned long kallsyms_lookup_name (const char *name) + typedef typeof(&kallsyms_on_each_symbol) kallsyms_on_each_symbol_fn; + + // XXX Will be linked in place of the kernel's kallsyms_on_each_symbol: ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0) ++int kallsyms_on_each_symbol(int (*fn)(void *, const char *, ++ unsigned long), ++ void *data) ++#else + int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, + unsigned long), + void *data) ++#endif + { + /* First, try to use a kallsyms_lookup_name address passed to us + through the relocation mechanism. */ +@@ -1170,6 +1176,39 @@ int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, + _stp_error("BUG: attempting to use unavailable kallsyms_on_each_symbol!!\n"); + return 0; + } ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,12,0) ++typedef typeof(&module_kallsyms_on_each_symbol) module_kallsyms_on_each_symbol_fn; ++ ++// XXX Will be linked in place of the kernel's module_kallsyms_on_each_symbol: ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0) ++int module_kallsyms_on_each_symbol(const char *modname, ++ int (*fn)(void *, const char *, ++ unsigned long), ++ void *data) ++#else ++int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, ++ unsigned long), ++ void *data) ++#endif ++{ ++ /* First, try to use a kallsyms_lookup_name address passed to us ++ through the relocation mechanism. */ ++ if (_stp_module_kallsyms_on_each_symbol != NULL) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0) ++ return (* (module_kallsyms_on_each_symbol_fn)_stp_module_kallsyms_on_each_symbol)(modname, fn, data); ++#else ++ return (* (module_kallsyms_on_each_symbol_fn)_stp_module_kallsyms_on_each_symbol)(fn, data); ++#endif ++ ++ /* Next, give up and signal a BUG. We should have detected ++ that this function is not available and used a different ++ mechanism! */ ++ _stp_error("BUG: attempting to use unavailable module_kallsyms_on_each_symbol!!\n"); ++ return 0; ++} ++#endif ++ + #endif + + +diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c +index 7f2fe0fc8..3af9a1098 100644 +--- a/runtime/transport/symbols.c ++++ b/runtime/transport/symbols.c +@@ -119,6 +119,10 @@ static void _stp_do_relocation(const char __user *buf, size_t count) + _stp_kallsyms_on_each_symbol = (void *) msg.address; + } + #endif ++ if (!strcmp ("kernel", msg.module) ++ && !strcmp ("module_kallsyms_on_each_symbol", msg.reloc)) { ++ _stp_module_kallsyms_on_each_symbol = (void *) msg.address; ++ } + + _stp_kmodule_update_address(msg.module, msg.reloc, msg.address); + } +diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c +index 3db76badf..cf57d4286 100644 +--- a/runtime/transport/transport.c ++++ b/runtime/transport/transport.c +@@ -614,6 +614,7 @@ static int _stp_transport_init(void) + #if defined(STAPCONF_KALLSYMS_ON_EACH_SYMBOL) && !defined(STAPCONF_KALLSYMS_ON_EACH_SYMBOL_EXPORTED) + _stp_kallsyms_on_each_symbol = NULL; + #endif ++ _stp_module_kallsyms_on_each_symbol = NULL; + #if defined(CONFIG_KALLSYMS) && !defined(STAPCONF_KALLSYMS_LOOKUP_NAME_EXPORTED) + _stp_need_kallsyms_stext = 0; + #endif +diff --git a/staprun/staprun.c b/staprun/staprun.c +index edd1bc67a..8437f3af6 100644 +--- a/staprun/staprun.c ++++ b/staprun/staprun.c +@@ -640,6 +640,7 @@ int send_relocation_kernel () + int found_stext = 0; + int found_kallsyms_lookup_name = 0; + int found_kallsyms_on_each_symbol = 0; ++ int found_module_kallsyms_on_each_symbol = 0; + int done_with_kallsyms = 0; + char *line = NULL; + size_t linesz = 0; +@@ -681,10 +682,20 @@ int send_relocation_kernel () + + found_kallsyms_on_each_symbol = 1; + } ++ else if (linesize - pos == sizeof "module_kallsyms_on_each_symbol" ++ && !strcmp(line + pos, "module_kallsyms_on_each_symbol" "\n")) ++ { ++ rc = send_a_relocation ("kernel", "module_kallsyms_on_each_symbol", address); ++ if (rc != 0) // non fatal, follows perror() ++ dbug(1, "Relocation was reloc module_kallsyms_on_each_symbol=%llx\n", address); ++ ++ found_module_kallsyms_on_each_symbol = 1; ++ } + } + done_with_kallsyms = found_stext + && found_kallsyms_lookup_name +- && found_kallsyms_on_each_symbol; ++ && found_kallsyms_on_each_symbol ++ && found_module_kallsyms_on_each_symbol; + } + free (line); + fclose (kallsyms); diff --git a/rhbz2230079b.patch b/rhbz2230079b.patch new file mode 100644 index 0000000..8165482 --- /dev/null +++ b/rhbz2230079b.patch @@ -0,0 +1,41 @@ +commit 5251b3060790faafa9f94c14801baaa76a2bf8ea +Author: William Cohen +Date: Wed Jun 7 13:18:01 2023 -0400 + + Adjust runtime module_kallsyms_on_each_symbol to work with Linux 6.3 kernels + + The recent fix for PR30415 worked for new Linux 6.4 kernels and + pre-6.3 kernels, but did not work for Linux 6.3 kernels. The Linux + 6.3 kernel module_kallsyms_on_each_symbol function has both the + modname argument of the 6.4 kernels and the function passed in has the + earlier kernel's struct module pointer argument. The runtime/sym.c has + been adjusted to work with the the Linux 6.3 kernels. + +diff --git a/runtime/sym.c b/runtime/sym.c +index 29171b45f..cc5c7c4dd 100644 +--- a/runtime/sym.c ++++ b/runtime/sym.c +@@ -1187,15 +1187,22 @@ int module_kallsyms_on_each_symbol(const char *modname, + unsigned long), + void *data) + #else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) ++int module_kallsyms_on_each_symbol(const char *modname, ++ int (*fn)(void *, const char *, struct module *, ++ unsigned long), ++ void *data) ++#else + int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, + unsigned long), + void *data) + #endif ++#endif + { + /* First, try to use a kallsyms_lookup_name address passed to us + through the relocation mechanism. */ + if (_stp_module_kallsyms_on_each_symbol != NULL) +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) + return (* (module_kallsyms_on_each_symbol_fn)_stp_module_kallsyms_on_each_symbol)(modname, fn, data); + #else + return (* (module_kallsyms_on_each_symbol_fn)_stp_module_kallsyms_on_each_symbol)(fn, data); diff --git a/rhbz2230079c.patch b/rhbz2230079c.patch new file mode 100644 index 0000000..906232a --- /dev/null +++ b/rhbz2230079c.patch @@ -0,0 +1,25 @@ +commit fc6519089d3f9366470ce442b648d69ed9b56f53 +Author: William Cohen +Date: Wed Jun 7 21:50:34 2023 -0400 + + Make runtime/transport/symbols.c compatible with newer struct module_memory + + The upstream kernel commit ac3b43283923440900b4f36ca5f9f0b1ca43b70e + changed the structures for modules. The runtime/transport/symbols.c + made an access to the struct module_memory and needed the appropriate + field name for the newer kernels. This change allows another dozen of + the systemtap examples to pass on Linux 6.4 kernels. + +diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c +index 3af9a1098..85cbc4bab 100644 +--- a/runtime/transport/symbols.c ++++ b/runtime/transport/symbols.c +@@ -390,6 +390,8 @@ static int _stp_module_update_self (void) + _stp_module_self.sections[1].static_addr = address; + #ifdef STAPCONF_MODULE_LAYOUT + _stp_module_self.sections[1].size = mod->core_layout.text_size; ++#elif STAPCONF_MODULE_MEMORY ++ _stp_module_self.sections[1].size = mod->mem[MOD_TEXT].size; + #elif defined(STAPCONF_GRSECURITY) + _stp_module_self.sections[1].size = mod->core_size_rx; + #else diff --git a/rhbz2230079d.patch b/rhbz2230079d.patch new file mode 100644 index 0000000..dd62467 --- /dev/null +++ b/rhbz2230079d.patch @@ -0,0 +1,26 @@ +commit 56054abb4efb3ef95808306b2f22339ab5c96352 +Author: William Cohen +Date: Thu Jun 8 13:10:00 2023 -0400 + + Make runtime/transport/alloc.c compatible with newer struct module_memory + + The upstream kernel commit ac3b43283923440900b4f36ca5f9f0b1ca43b70e + changed the structures for modules. The runtime/transport/alloc.c + made an access to the struct module_memory when -DSTP_MAXMEMORY is + used on the command line and needed the appropriate field name for the + newer kernels. This change allows stap script builds using + -DSTP_MAXMEMORY to work on Linux 6.4 kernels. + +diff --git a/runtime/linux/alloc.c b/runtime/linux/alloc.c +index 885800d9f..9fbe8ae0a 100644 +--- a/runtime/linux/alloc.c ++++ b/runtime/linux/alloc.c +@@ -271,6 +271,8 @@ static void _stp_mem_debug_validate(void *addr) + #ifdef STP_MAXMEMORY + #ifdef STAPCONF_MODULE_LAYOUT + #define _STP_MODULE_CORE_SIZE (THIS_MODULE->core_layout.size) ++#elif STAPCONF_MODULE_MEMORY ++#define _STP_MODULE_CORE_SIZE (THIS_MODULE->mem[MOD_TEXT].size) + #elif defined(STAPCONF_GRSECURITY) + #define _STP_MODULE_CORE_SIZE (THIS_MODULE->core_size_rw) + #else diff --git a/rhbz2230079e.patch b/rhbz2230079e.patch new file mode 100644 index 0000000..18aa4d8 --- /dev/null +++ b/rhbz2230079e.patch @@ -0,0 +1,37 @@ +commit 788c58ced532537b87f596355d3e9b6dec30e61a +Author: William Cohen +Date: Thu Jun 29 13:17:38 2023 -0400 + + Fedora rawhide kernels are now flagging use of zero length arrays + + The kernel has switched from using zero length arrays to flexible + arrays. The kernel compiles have gotten picker and now flags accesses + beyond the end of end of arrays when possible. When trying to run the + testsuite on Fedora rawhide got the following error due to a zero + length array: + + In file included from /tmp/stapaBPtwB/stap_6b7e9ee7df4a3f6e4cfbffb7f92d8405_1736_src.c:543: + /home/wcohen/systemtap_write/install/share/systemtap/runtime/linux/stp_tracepoint.c: In function 'add_tracepoint': + /home/wcohen/systemtap_write/install/share/systemtap/runtime/linux/stp_tracepoint.c:148:22: error: 'strcmp' reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread] + 148 | if (!strcmp(name, e->name)) { + | ^~~~~~~~~~~~~~~~~~~~~ + /home/wcohen/systemtap_write/install/share/systemtap/runtime/linux/stp_tracepoint.c:61:14: note: source object 'name' of size 0 + 61 | char name[0]; + | ^~~~ + + Switched the zero length array in the struct to a flexible array to + eliminate the issue. + +diff --git a/runtime/linux/stp_tracepoint.c b/runtime/linux/stp_tracepoint.c +index 1edac313c..508948dce 100644 +--- a/runtime/linux/stp_tracepoint.c ++++ b/runtime/linux/stp_tracepoint.c +@@ -58,7 +58,7 @@ struct tracepoint_entry { + struct tracepoint *tp; + int refcount; + struct list_head probes; +- char name[0]; ++ char name[]; + }; + + struct stp_tp_probe { diff --git a/rhbz2230079f.patch b/rhbz2230079f.patch new file mode 100644 index 0000000..4f56bb0 --- /dev/null +++ b/rhbz2230079f.patch @@ -0,0 +1,59 @@ +commit c893e0eaa4dedc90fafc9353ea00fc34ad4b6d42 +Author: William Cohen +Date: Wed May 17 10:38:31 2023 -0400 + + Support newer kernels with struct module_memory + + The upstream kernel commit ac3b43283923440900b4f36ca5f9f0b1ca43b70e + changed the structures for modules. The runtime printing of kernel + information accessed information about modules and the fields in + module structure. A test has been added to the autoconf list to + determine the appropriate fields to get information about the + module. + +diff --git a/buildrun.cxx b/buildrun.cxx +index a4a254c7d..7f4ad860d 100644 +--- a/buildrun.cxx ++++ b/buildrun.cxx +@@ -512,6 +512,8 @@ compile_pass (systemtap_session& s) + + output_autoconf(s, o, cs, "autoconf-module_layout.c", + "STAPCONF_MODULE_LAYOUT", NULL); ++ output_autoconf(s, o, cs, "autoconf-module_memory.c", ++ "STAPCONF_MODULE_MEMORY", NULL); + output_autoconf(s, o, cs, "autoconf-mod_kallsyms.c", + "STAPCONF_MOD_KALLSYMS", NULL); + output_exportconf(s, o2, "get_user_pages_remote", "STAPCONF_GET_USER_PAGES_REMOTE"); +diff --git a/runtime/linux/autoconf-module_memory.c b/runtime/linux/autoconf-module_memory.c +new file mode 100644 +index 000000000..db04b8d2e +--- /dev/null ++++ b/runtime/linux/autoconf-module_memory.c +@@ -0,0 +1,3 @@ ++#include ++ ++struct module_memory ml; +diff --git a/runtime/linux/print.c b/runtime/linux/print.c +index 57a157986..594b155be 100644 +--- a/runtime/linux/print.c ++++ b/runtime/linux/print.c +@@ -361,6 +361,11 @@ static void _stp_print_kernel_info(char *sname, char *vstr, int ctx, int num_pro + (unsigned long) (THIS_MODULE->core_layout.size - THIS_MODULE->core_layout.text_size)/1024, + (unsigned long) (THIS_MODULE->core_layout.text_size)/1024, + #else ++#if STAPCONF_MODULE_MEMORY ++ (unsigned long) THIS_MODULE->mem[MOD_TEXT].base, ++ (unsigned long) (THIS_MODULE->mem[MOD_DATA].size)/1024, ++ (unsigned long) (THIS_MODULE->mem[MOD_TEXT].size)/1024, ++#else + #ifndef STAPCONF_GRSECURITY + (unsigned long) THIS_MODULE->module_core, + (unsigned long) (THIS_MODULE->core_size - THIS_MODULE->core_text_size)/1024, +@@ -370,6 +375,7 @@ static void _stp_print_kernel_info(char *sname, char *vstr, int ctx, int num_pro + (unsigned long) (THIS_MODULE->core_size_rw - THIS_MODULE->core_size_rx)/1024, + (unsigned long) (THIS_MODULE->core_size_rx)/1024, + #endif ++#endif + #endif + ctx/1024, + _stp_allocated_net_memory/1024, diff --git a/rhbz2230079g.patch b/rhbz2230079g.patch new file mode 100644 index 0000000..ced7c6e --- /dev/null +++ b/rhbz2230079g.patch @@ -0,0 +1,47 @@ +commit fabe87cb502d7990b91ed59d9773d308dfdb9a8a +Author: Frank Ch. Eigler +Date: Fri Jun 30 15:56:16 2023 -0400 + + runtime: tweak STAPCONF_MODULE_MEMORY cpp + + Correct build breakage on rhel7. + +diff --git a/runtime/linux/alloc.c b/runtime/linux/alloc.c +index 9fbe8ae0a..796ad5169 100644 +--- a/runtime/linux/alloc.c ++++ b/runtime/linux/alloc.c +@@ -271,7 +271,7 @@ static void _stp_mem_debug_validate(void *addr) + #ifdef STP_MAXMEMORY + #ifdef STAPCONF_MODULE_LAYOUT + #define _STP_MODULE_CORE_SIZE (THIS_MODULE->core_layout.size) +-#elif STAPCONF_MODULE_MEMORY ++#elif defined(STAPCONF_MODULE_MEMORY) + #define _STP_MODULE_CORE_SIZE (THIS_MODULE->mem[MOD_TEXT].size) + #elif defined(STAPCONF_GRSECURITY) + #define _STP_MODULE_CORE_SIZE (THIS_MODULE->core_size_rw) +diff --git a/runtime/linux/print.c b/runtime/linux/print.c +index 594b155be..db71871d2 100644 +--- a/runtime/linux/print.c ++++ b/runtime/linux/print.c +@@ -361,7 +361,7 @@ static void _stp_print_kernel_info(char *sname, char *vstr, int ctx, int num_pro + (unsigned long) (THIS_MODULE->core_layout.size - THIS_MODULE->core_layout.text_size)/1024, + (unsigned long) (THIS_MODULE->core_layout.text_size)/1024, + #else +-#if STAPCONF_MODULE_MEMORY ++#ifdef STAPCONF_MODULE_MEMORY + (unsigned long) THIS_MODULE->mem[MOD_TEXT].base, + (unsigned long) (THIS_MODULE->mem[MOD_DATA].size)/1024, + (unsigned long) (THIS_MODULE->mem[MOD_TEXT].size)/1024, +diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c +index 85cbc4bab..b5951deff 100644 +--- a/runtime/transport/symbols.c ++++ b/runtime/transport/symbols.c +@@ -390,7 +390,7 @@ static int _stp_module_update_self (void) + _stp_module_self.sections[1].static_addr = address; + #ifdef STAPCONF_MODULE_LAYOUT + _stp_module_self.sections[1].size = mod->core_layout.text_size; +-#elif STAPCONF_MODULE_MEMORY ++#elif defined(STAPCONF_MODULE_MEMORY) + _stp_module_self.sections[1].size = mod->mem[MOD_TEXT].size; + #elif defined(STAPCONF_GRSECURITY) + _stp_module_self.sections[1].size = mod->core_size_rx; diff --git a/sources b/sources index a210820..6711998 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (systemtap-5.4.tar.gz) = 5869fe3735e44be65ba7895a46b4ea66fcdcc21ed2ab0673c62d822730553837f816d82fd78eeca4bfe6f17fdeaa12eb2f94c0b0b7ebb8c495c961f0b6935785 +SHA512 (systemtap-4.9.tar.gz) = a2736223fee0c801c36719a0245f31ed7e2e63c30bb7d5cab631dd57e4eb10e04abf2c9b272bda2a17c207c9dd163a1eb8a3e0759eda0c781946e644625510b7 diff --git a/systemtap-gcc16.patch b/systemtap-gcc16.patch deleted file mode 100644 index c336ce6..0000000 --- a/systemtap-gcc16.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- systemtap-5.4/configure~ 2025-10-30 14:47:35.000000000 +0000 -+++ systemtap-5.4/configure 2026-01-13 18:53:20.466037572 +0000 -@@ -3121,8 +3121,8 @@ - } - { - // Unicode literals -- char const *utf8 = u8"UTF-8 string \u2500"; -- char16_t const *utf16 = u"UTF-8 string \u2500"; -+ auto const *utf8 = u8"UTF-8 string \u2500"; -+ char16_t const *utf16 = u"UTF-16 string \u2500"; - char32_t const *utf32 = U"UTF-32 string \u2500"; - } - ' diff --git a/systemtap.spec b/systemtap.spec index 577dc67..0e0d146 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -1,5 +1,3 @@ -# work around flakey gcc warnings -%{!?with_Werror: %global with_Werror 0} %{!?with_sqlite: %global with_sqlite 0%{?fedora} >= 17 || 0%{?rhel} >= 7} # prefer prebuilt docs %{!?with_docs: %global with_docs 0} @@ -13,8 +11,8 @@ %endif %{!?with_rpm: %global with_rpm 1} %{!?elfutils_version: %global elfutils_version 0.179} -%{!?with_boost: %global with_boost 1} -%ifarch x86_64 ppc ppc64 ppc64le aarch64 +%{!?with_boost: %global with_boost 0} +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le aarch64 %{!?with_dyninst: %global with_dyninst 0%{?fedora} >= 18 || 0%{?rhel} >= 7} %else %{!?with_dyninst: %global with_dyninst 0} @@ -45,13 +43,9 @@ %{!?with_httpd: %global with_httpd 0} %{!?with_specific_python: %global with_specific_python 0%{?fedora} >= 31} %{!?with_sysusers: %global with_sysusers 0%{?fedora} >= 32 || 0%{?rhel} >= 9} -# NB: can't turn this on by default on any distro version whose builder system -# may run kernels different than the distro version itself. -%{!?with_check: %global with_check 0} - # Virt is supported on these arches, even on el7, but it's not in core EL7 -%if 0%{?rhel} && 0%{?rhel} <= 7 +%if 0%{?rhel} <= 7 %ifarch ppc64le aarch64 %global with_virthost 0 %endif @@ -70,6 +64,9 @@ %else %if 0%{?rhel} >= 6 %define udevrulesdir /lib/udev/rules.d + %else + # RHEL5 + %define udevrulesdir /etc/udev/rules.d %endif %endif %endif @@ -86,7 +83,11 @@ %define dracutbindir %{_bindir} %endif -%{!?_rpmmacrodir: %define _rpmmacrodir %{_rpmconfigdir}/macros.d} +%if 0%{?rhel} == 6 + %{!?_rpmmacrodir: %define _rpmmacrodir /etc/rpm/} +%else + %{!?_rpmmacrodir: %define _rpmmacrodir %{_rpmconfigdir}/macros.d} +%endif # To avoid testsuite/*/*.stp has shebang which doesn't start with '/' %define __brp_mangle_shebangs_exclude_from .stp$ @@ -96,10 +97,7 @@ \ g stapusr 156\ g stapsys 157\ -g stapdev 158\ -g stapunpriv 159\ -u stapunpriv 159 "systemtap unprivileged user" /var/lib/stapunpriv /sbin/nologin\ -m stapunpriv stapunpriv +g stapdev 158 %define _systemtap_server_preinstall \ # See systemd-sysusers(8) sysusers.d(5)\ @@ -121,16 +119,10 @@ m stapsys stapsys\ m stapdev stapusr\ m stapdev stapdev -%define _systemtap_server_preinstall_tmpfiles \ -# See systemd-tmpfiles(8) tmpfiles.d(5)\ -d /var/lib/stap-server 0750 stap-server stap-server -\ -d /var/lib/stap-server/.systemtap 0700 stap-server stap-server -\ -d /var/log/stap-server 0755 stap-server stap-server -\ -f /var/log/stap-server/log 0644 stap-server stap-server - Name: systemtap # PRERELEASE -Version: 5.4 +Version: 4.9 Release: 2%{?release_override}%{?dist} # for version, see also configure.ac @@ -143,8 +135,7 @@ Release: 2%{?release_override}%{?dist} # systemtap-runtime /usr/bin/staprun, /usr/bin/stapsh, /usr/bin/stapdyn # systemtap-client /usr/bin/stap, samples, docs, tapset(bonus), req:-runtime # systemtap-initscript /etc/init.d/systemtap, dracut module, req:systemtap -# systemtap-sdt-devel /usr/include/sys/sdt.h -# systemtap-sdt-dtrace /usr/bin/dtrace +# systemtap-sdt-devel /usr/include/sys/sdt.h /usr/bin/dtrace # systemtap-testsuite /usr/share/systemtap/testsuite*, req:systemtap, req:sdt-devel # systemtap-runtime-java libHelperSDT.so, HelperSDT.jar, stapbm, req:-runtime # systemtap-runtime-virthost /usr/bin/stapvirt, req:libvirt req:libxml2 @@ -165,10 +156,18 @@ Release: 2%{?release_override}%{?dist} # intermediary stap-server for --use-server: systemtap-server (-devel unused) Summary: Programmable system-wide instrumentation system -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz -Patch0: systemtap-gcc16.patch +Patch1: rhbz2230079.patch +Patch2: rhbz2230079a.patch +Patch3: rhbz2230079b.patch +Patch4: rhbz2230079c.patch +Patch5: rhbz2230079d.patch +Patch6: rhbz2230079e.patch +Patch7: rhbz2230079f.patch +Patch8: rhbz2230079g.patch + # Build* BuildRequires: make @@ -179,7 +178,6 @@ BuildRequires: pkgconfig(nss) BuildRequires: pkgconfig(avahi-client) %if %{with_debuginfod} BuildRequires: pkgconfig(libdebuginfod) -BuildRequires: pkgconfig(json-c) %endif %if %{with_dyninst} BuildRequires: dyninst-devel >= 10.0 @@ -196,7 +194,9 @@ BuildRequires: pkgconfig(ncurses) BuildRequires: systemd %endif # Needed for libstd++ < 4.0, without +%if %{with_boost} BuildRequires: boost-devel +%endif %if %{with_crash} BuildRequires: crash-devel zlib-devel %endif @@ -218,7 +218,7 @@ BuildRequires: xmlto /usr/share/xmlto/format/fo/pdf %endif %if %{with_emacsvim} # for _emacs_sitelispdir macros etc. -BuildRequires: emacs-common +BuildRequires: emacs %endif %if %{with_java} BuildRequires: java-devel @@ -229,6 +229,9 @@ BuildRequires: pkgconfig(libvirt) BuildRequires: pkgconfig(libxml-2.0) %endif BuildRequires: readline-devel +%if 0%{?rhel} <= 5 +BuildRequires: pkgconfig(ncurses) +%endif %if %{with_python2_probes} BuildRequires: python2-devel %if 0%{?fedora} >= 1 @@ -250,14 +253,8 @@ BuildRequires: libmicrohttpd-devel BuildRequires: libuuid-devel %endif %if %{with_sysusers} -BuildRequires: systemd-rpm-macros +BuildRequires: systemd-rpm-macros %endif -%if %{with_check} -BuildRequires: kernel-devel -# and some of the same Requires: as below -BuildRequires: dejagnu gcc make -%endif - # Install requirements @@ -274,8 +271,8 @@ the components needed to locally develop and execute systemtap scripts. %package server Summary: Instrumentation System Server -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap-devel = %{version}-%{release} Conflicts: systemtap-devel < %{version}-%{release} Conflicts: systemtap-runtime < %{version}-%{release} @@ -304,8 +301,8 @@ compiles systemtap scripts to kernel objects on their demand. %package devel Summary: Programmable system-wide instrumentation system - development headers, tools -License: GPL-2.0-or-later AND GPL-2.0-only AND BSD-3-Clause AND LGPL-2.1-only AND BSD-2-Clause -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ %if 0%{?rhel} >= 8 || 0%{?fedora} >= 20 Recommends: (kernel-debug-devel if kernel-debug) @@ -334,8 +331,8 @@ a copy of the standard tapset library and the runtime library C files. %package runtime Summary: Programmable system-wide instrumentation system - runtime -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires(pre): shadow-utils Conflicts: systemtap-devel < %{version}-%{release} Conflicts: systemtap-server < %{version}-%{release} @@ -349,8 +346,8 @@ using a local or remote systemtap-devel installation. %package client Summary: Programmable system-wide instrumentation system - client -License: GPL-2.0-or-later AND GPL-2.0-only AND BSD-3-Clause AND LGPL-2.1-only AND GFDL-1.2-or-later AND BSD-2-Clause -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: zip unzip Requires: systemtap-runtime = %{version}-%{release} Requires: coreutils grep sed unzip zip @@ -363,19 +360,17 @@ Requires: mokutil %endif %description client -This package contains/requires only the components needed to -use systemtap scripts by compiling them using a local or a remote -systemtap-server service, then run them using a local or -remote systemtap-runtime. It includes script samples and +This package contains/requires the components needed to develop +systemtap scripts, and compile them using a local systemtap-devel +or a remote systemtap-server installation, then run them using a +local or remote systemtap-runtime. It includes script samples and documentation, and a copy of the tapset library for reference. -It does NOT include all the components for running a systemtap -script in a self-contained fashion; for that, use the -devel -subpackage instead. + %package initscript Summary: Systemtap Initscripts -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap = %{version}-%{release} %if %{with_systemd} Requires: systemd @@ -393,24 +388,9 @@ boot-time probing if supported. %package sdt-devel -Summary: Static probe support header files -License: GPL-2.0-or-later AND CC0-1.0 -URL: https://sourceware.org/systemtap/ -%if 0%{?rhel} && 0%{?rhel} <= 10 -# for RHEL buildability compatibility, pull in sdt-dtrace at all times -Requires: systemtap-sdt-dtrace = %{version}-%{release} -%endif - -%description sdt-devel -This package includes the header file used for static -instrumentation compiled into userspace programs. - - -%package sdt-dtrace -Summary: Static probe support dtrace tool -License: GPL-2.0-or-later AND CC0-1.0 -URL: https://sourceware.org/systemtap/ -Provides: dtrace = %{version}-%{release} +Summary: Static probe support tools +License: GPLv2+ and Public Domain +URL: http://sourceware.org/systemtap/ %if %{with_pyparsing} %if %{with_python3} Requires: python3-pyparsing @@ -423,19 +403,21 @@ Requires: python2-pyparsing %endif %endif -%description sdt-dtrace -This package includes the dtrace-compatibility preprocessor -to process related .d files into tracing-macro-laden .h headers. +%description sdt-devel +This package includes the header file used for static +instrumentation compiled into userspace programs and libraries, along +with the optional dtrace-compatibility preprocessor to process related +.d files into tracing-macro-laden .h headers. %package testsuite Summary: Instrumentation System Testsuite -License: GPL-2.0-or-later AND GPL-2.0-only AND GPL-3.0-or-later AND MIT -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap = %{version}-%{release} Requires: systemtap-sdt-devel = %{version}-%{release} Requires: systemtap-server = %{version}-%{release} -Requires: dejagnu which elfutils grep nc wget +Requires: dejagnu which elfutils grep nc %if %{with_debuginfod} Requires: elfutils-debuginfod %endif @@ -502,8 +484,8 @@ systemtap on the current system. %if %{with_java} %package runtime-java Summary: Systemtap Java Runtime Support -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} # work around fedora ci gating kvetching about i686<->x86-64 conflicts %ifarch x86_64 @@ -524,8 +506,8 @@ that probe Java processes running on the OpenJDK runtimes using Byteman. %if %{with_python2_probes} %package runtime-python2 Summary: Systemtap Python 2 Runtime Support -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} %description runtime-python2 @@ -536,8 +518,8 @@ that probe python 2 processes. %if %{with_python3_probes} %package runtime-python3 Summary: Systemtap Python 3 Runtime Support -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} %if ! (%{with_python2_probes}) @@ -553,8 +535,8 @@ that probe python 3 processes. %if %{with_python3_probes} %package exporter Summary: Systemtap-prometheus interoperation mechanism -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} %description exporter @@ -566,8 +548,8 @@ to remote requesters on demand. %if %{with_virthost} %package runtime-virthost Summary: Systemtap Cross-VM Instrumentation - host -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ # only require libvirt-libs really #Requires: libvirt >= 1.0.2 Requires: libxml2 @@ -581,8 +563,8 @@ connection. %if %{with_virtguest} %package runtime-virtguest Summary: Systemtap Cross-VM Instrumentation - guest -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} %if %{with_systemd} Requires(post): findutils coreutils @@ -599,22 +581,31 @@ This package installs the services necessary on a virtual machine for a systemtap-runtime-virthost machine to execute systemtap scripts. %endif +%if %{with_python3} && %{with_monitor} %package jupyter Summary: ISystemtap jupyter kernel and examples -License: GPL-2.0-or-later -URL: https://sourceware.org/systemtap/ +License: GPLv2+ +URL: http://sourceware.org/systemtap/ Requires: systemtap = %{version}-%{release} %description jupyter This package includes files needed to build and run the interactive systemtap Jupyter kernel, either locally or within a container. - +%endif # ------------------------------------------------------------------------ %prep %setup -q -%patch 0 -p1 + +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 %build @@ -625,13 +616,6 @@ or within a container. %global dyninst_config --without-dyninst %endif -# Enable/disable the dyninst pure-userspace backend -%if %{with_Werror} -%global Werror_config --enable-Werror -%else -%global Werror_config --disable-Werror -%endif - # Enable/disable the sqlite coverage testing support %if %{with_sqlite} %global sqlite_config --enable-sqlite @@ -719,7 +703,7 @@ or within a container. # We don't ship compileworthy python code, just oddball samples %global py_auto_byte_compile 0 -%configure %{Werror_config} %{dyninst_config} %{sqlite_config} %{crash_config} %{docs_config} %{rpm_config} %{java_config} %{virt_config} %{dracut_config} %{python3_config} %{python2_probes_config} %{python3_probes_config} %{httpd_config} %{bpf_config} %{debuginfod_config} --disable-silent-rules --with-extra-version="rpm %{version}-%{release}" +%configure %{dyninst_config} %{sqlite_config} %{crash_config} %{docs_config} %{rpm_config} %{java_config} %{virt_config} %{dracut_config} %{python3_config} %{python2_probes_config} %{python3_probes_config} %{httpd_config} %{bpf_config} %{debuginfod_config} --disable-silent-rules --with-extra-version="rpm %{version}-%{release}" make %{?_smp_mflags} V=1 @@ -742,8 +726,6 @@ mkdir -p %{buildroot}%{_sysusersdir} echo '%_systemtap_runtime_preinstall' > %{buildroot}%{_sysusersdir}/systemtap-runtime.conf echo '%_systemtap_server_preinstall' > %{buildroot}%{_sysusersdir}/systemtap-server.conf echo '%_systemtap_testsuite_preinstall' > %{buildroot}%{_sysusersdir}/systemtap-testsuite.conf -mkdir -p %{buildroot}%{_tmpfilesdir} -echo '%_systemtap_server_preinstall_tmpfiles' > %{buildroot}%{_tmpfilesdir}/systemtap-server.conf %endif @@ -761,6 +743,9 @@ find testsuite -type f -name '.gitignore' -print0 | xargs -0 rm -f # permissions back to 04110 in the %files section below. chmod 755 $RPM_BUILD_ROOT%{_bindir}/staprun +#install the useful stap-prep script +install -c -m 755 stap-prep $RPM_BUILD_ROOT%{_bindir}/stap-prep + # Copy over the testsuite cp -rp testsuite $RPM_BUILD_ROOT%{_datadir}/systemtap @@ -869,49 +854,30 @@ done %py3_shebang_fix %{buildroot}%{python3_sitearch} %{buildroot}%{_bindir}/* %endif -%check -%if %{with_check} -make check RUNTESTFLAGS=environment_sanity.exp -%endif - - %pre runtime %if %{with_sysusers} -%if (0%{?fedora} && 0%{?fedora} < 42) || (0%{?rhel} && 0%{?rhel} < 11) echo '%_systemtap_runtime_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-runtime.conf - -exit 0 -%endif %else getent group stapusr >/dev/null || groupadd -f -g 156 -r stapusr getent group stapsys >/dev/null || groupadd -f -g 157 -r stapsys getent group stapdev >/dev/null || groupadd -f -g 158 -r stapdev -getent passwd stapunpriv >/dev/null || \ - useradd -c "Systemtap Unprivileged User" -u 159 -g stapunpriv -d %{_localstatedir}/lib/stapunpriv -r -s /sbin/nologin stapunpriv 2>/dev/null || \ - useradd -c "Systemtap Unprivileged User" -g stapunpriv -d %{_localstatedir}/lib/stapunpriv -r -s /sbin/nologin stapunpriv -exit 0 %endif +exit 0 %pre server %if %{with_sysusers} -%if (0%{?fedora} && 0%{?fedora} < 42) || (0%{?rhel} && 0%{?rhel} < 11) echo '%_systemtap_server_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-server.conf - -echo '%_systemtap_server_preinstall_tmpfiles' | systemd-tmpfiles --replace=%{_tmpfilesdir}/systemtap-server.conf - -exit 0 -%endif %else getent group stap-server >/dev/null || groupadd -f -g 155 -r stap-server getent passwd stap-server >/dev/null || \ useradd -c "Systemtap Compile Server" -u 155 -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server 2>/dev/null || \ useradd -c "Systemtap Compile Server" -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server -exit 0 %endif +exit 0 %pre testsuite %if %{with_sysusers} -%if (0%{?fedora} && 0%{?fedora} < 42) || (0%{?rhel} && 0%{?rhel} < 11) echo '%_systemtap_testsuite_preinstall' | systemd-sysusers --replace=%{_sysusersdir}/systemtap-testsuite.conf - -exit 0 -%endif %else getent passwd stapusr >/dev/null || \ useradd -c "Systemtap 'stapusr' User" -g stapusr -r -s /sbin/nologin stapusr @@ -919,8 +885,8 @@ getent passwd stapsys >/dev/null || \ useradd -c "Systemtap 'stapsys' User" -g stapsys -G stapusr -r -s /sbin/nologin stapsys getent passwd stapdev >/dev/null || \ useradd -c "Systemtap 'stapdev' User" -g stapdev -G stapusr -r -s /sbin/nologin stapdev -exit 0 %endif +exit 0 %post server @@ -1128,7 +1094,6 @@ exit 0 %if %{with_systemd} %{_unitdir}/stap-server.service %{_tmpfilesdir}/stap-server.conf -%{_tmpfilesdir}/systemtap-server.conf %else %{initdir}/stap-server %dir %{_sysconfdir}/stap-server/conf.d @@ -1175,14 +1140,13 @@ exit 0 %if %{with_emacsvim} %{_emacs_sitelispdir}/*.el* %{_emacs_sitestartdir}/systemtap-init.el -%{_datadir}/vim/vimfiles +%{_datadir}/vim/vimfiles/*/*.vim %endif # Notice that the stap-resolve-module-function.py file is used by # *both* the python2 and python3 subrpms. Both subrpms use that same # python script to help list python probes. %if %{with_python3_probes} || %{with_python2_probes} %{_libexecdir}/systemtap/python/stap-resolve-module-function.py -%dir %{_libexecdir}/systemtap/python %exclude %{_libexecdir}/systemtap/python/stap-resolve-module-function.py? %endif @@ -1277,22 +1241,16 @@ exit 0 %files sdt-devel +%{_bindir}/dtrace %{_includedir}/sys/sdt.h %{_includedir}/sys/sdt-config.h +%{_mandir}/man1/dtrace.1* %{_rpmmacrodir}/macros.systemtap %doc README AUTHORS NEWS %{!?_licensedir:%global license %%doc} %license COPYING -%files sdt-dtrace -%{_bindir}/dtrace -%doc README AUTHORS NEWS -%{!?_licensedir:%global license %%doc} -%license COPYING -%{_mandir}/man1/dtrace.1* - - %files testsuite %dir %{_datadir}/systemtap %{_datadir}/systemtap/testsuite @@ -1349,106 +1307,26 @@ exit 0 %{_sbindir}/stap-exporter %endif +%if %{with_python3} && %{with_monitor} %files jupyter %{_bindir}/stap-jupyter-container %{_bindir}/stap-jupyter-install %{_mandir}/man1/stap-jupyter.1* %dir %{_datadir}/systemtap %{_datadir}/systemtap/interactive-notebook +%endif # ------------------------------------------------------------------------ # Future new-release entries should be of the form # * DDD MMM DD YYYY YOURNAME - V-R # - Upstream release, see wiki page below for detailed notes. -# https://sourceware.org/systemtap/wiki/SystemTapReleases +# http://sourceware.org/systemtap/wiki/SystemTapReleases # PRERELEASE %changelog -* Tue Jan 13 2026 Jonathan Wakely - 5.4-2 -- Patched to workaround Autoconf 2.72 incompatiblity with GCC 16 - -* Fri Oct 31 2025 Frank Ch. Eigler - 5.4-1 -- Upstream release, see wiki page below for detailed notes. - https://sourceware.org/systemtap/wiki/SystemTapReleases - -* Mon Sep 22 2025 Frank Ch. Eigler - 5.4-17585496g86ab88eb -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Mon Sep 22 2025 Frank Ch. Eigler - 5.4-17585473g1fe4178d -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Fri Sep 19 2025 Python Maint - 5.3-5 -- Rebuilt for Python 3.14.0rc3 bytecode - -* Fri Aug 15 2025 Python Maint - 5.3-4 -- Rebuilt for Python 3.14.0rc2 bytecode - -* Fri Jul 25 2025 Fedora Release Engineering - 5.3-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Tue Jun 03 2025 Python Maint - 5.3-2 -- Rebuilt for Python 3.14 - -* Fri May 02 2025 Frank Ch. Eigler - 5.3-1 -- Upstream release, see wiki page below for detailed notes. - https://sourceware.org/systemtap/wiki/SystemTapReleases - -* Thu Feb 06 2025 Frank Ch. Eigler - 5.3~pre17373816g7a71d34b.5 -- Respin against dyninst 13 redux - -* Fri Jan 24 2025 Frank Ch. Eigler - 5.3~pre17373816g7a71d34b.3 -- Respin against dyninst 13, sans dyninst on i686. - -* Mon Jan 20 2025 Frank Ch. Eigler - 5.3-17373816g7a71d34b -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Mon Jan 20 2025 Frank Ch. Eigler - 5.3-17373794g3efe129d -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Sun Jan 19 2025 Frank Ch. Eigler - 5.3-17373422g9a48fbea -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Sun Jan 19 2025 Frank Ch. Eigler - 5.2-17373420g1e894ff0 -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Sun Jan 19 2025 Fedora Release Engineering - 5.2-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Fri Nov 08 2024 Frank Ch. Eigler - 5.2-1 -- Upstream release, see wiki page below for detailed notes. - https://sourceware.org/systemtap/wiki/SystemTapReleases - -* Mon Oct 07 2024 William Cohen - 5.2-17283218gc5774e18 -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Tue Oct 01 2024 William Cohen - 5.2-17277956g0b7f6722 -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Fri Aug 30 2024 Frank Ch. Eigler - 5.2-17250223gd07e4284 -- Automated weekly rawhide release -- Applied spec changes from upstream git - -* Thu Aug 08 2024 Lumír Balhar - 5.2-pre -- Final split of sdt-dtrace and sdt-devel (rhbz#2296275) - https://fedoraproject.org/wiki/Changes/Separate_dtrace_package - -* Fri Apr 26 2024 Frank Ch. Eigler - 5.1-1 -- Upstream release, see wiki page below for detailed notes. - https://sourceware.org/systemtap/wiki/SystemTapReleases - -* Sat Nov 04 2023 Frank Ch. Eigler - 5.0-1 -- Upstream release, see wiki page below for detailed notes. - https://sourceware.org/systemtap/wiki/SystemTapReleases -- migrated to SPDX license +* Thu Aug 10 2023 Will Cohen - 4.9-2 +- Support for linux 6.4 kernels (rhbz2230079). * Fri Apr 28 2023 Frank Ch. Eigler - 4.9-1 - Upstream release, see wiki page below for detailed notes. diff --git a/tests/Regression/PR16166/main.fmf b/tests/Regression/PR16166/main.fmf new file mode 100644 index 0000000..9a85d18 --- /dev/null +++ b/tests/Regression/PR16166/main.fmf @@ -0,0 +1,16 @@ +summary: Test for BZ#1054962 (Backport PR16166 stap -vvv causes SIGSEGV when) +description: Backport PR16166 +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +require: +recommend: + - valgrind + - systemtap +duration: 15m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1054962 +extra-summary: /tools/systemtap/Regression/PR16166 +extra-task: /tools/systemtap/Regression/PR16166 diff --git a/tests/Regression/PR16166/runtest.sh b/tests/Regression/PR16166/runtest.sh new file mode 100755 index 0000000..b2b2258 --- /dev/null +++ b/tests/Regression/PR16166/runtest.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/PR16166 +# Description: Test for BZ#1054962 (Backport PR16166 stap -vvv causes SIGSEGV when) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPDIR=\$(mktemp -d)" + rlRun "cp towers.c $TMPDIR/" + rlRun "pushd $TMPDIR" + + rlRun "gcc -g towers.c -o towers.x" + + cat > script.stp <<-EOF +global x + +probe perf.hw.cpu_cycles.process("towers.x").counter("a") {} + +probe process("towers.x").function("main") +{ + # wrong type + x = "b" . @perf("a") +} +EOF + rlRun "which valgrind" + rlRun "valgrind --version" + rlPhaseEnd + + rlPhaseStartTest + # following is expected to fail + rlRun "valgrind --log-file=output.txt stap -vvv script.stp" 1 + # ... but not to segfault + rlRun "grep SIGSEGV output.txt" 1 + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/PR16166/towers.c b/tests/Regression/PR16166/towers.c new file mode 100644 index 0000000..6465bc4 --- /dev/null +++ b/tests/Regression/PR16166/towers.c @@ -0,0 +1,155 @@ +# include +# include + +#define towersbase 2.39 + +/* Towers */ +#define maxcells 18 +#define stackrange 3 +#define true 1 +#define false 0 + +struct element +{ + int discsize; + int next; +}; + +/* Towers */ +int stack[stackrange + 1]; +struct element cellspace[maxcells + 1]; +int freelist, movesdone; + +/* Program to Solve the Towers of Hanoi */ + +void +error (emsg) + char *emsg; +{ + printf ("Error in Towers: %s\n", emsg); +} + +void +makenull (s) +{ + stack[s] = 0; +} + +int +get_element () +{ + int temp; + if (freelist > 0) + { + temp = freelist; + freelist = cellspace[freelist].next; + } + else + error ("out of space "); + return (temp); +} + +void +push (i, s) + int i, s; +{ + int errorfound, localel; + errorfound = false; + if (stack[s] > 0) + if (cellspace[stack[s]].discsize <= i) + { + errorfound = true; + error ("disc size error"); + }; + if (!errorfound) + { + localel = get_element (); + cellspace[localel].next = stack[s]; + stack[s] = localel; + cellspace[localel].discsize = i; + } +} + +void +init (s, n) + int s, n; +{ + int discctr; + makenull (s); + for (discctr = n; discctr >= 1; discctr--) + push (discctr, s); +} + +int +pop (s) + int s; +{ + int temp, temp1; + if (stack[s] > 0) + { + temp1 = cellspace[stack[s]].discsize; + temp = cellspace[stack[s]].next; + cellspace[stack[s]].next = freelist; + freelist = stack[s]; + stack[s] = temp; + return (temp1); + } + else + error ("nothing to pop "); + return 0; +} + +void +move (s1, s2) + int s1, s2; +{ + push (pop (s1), s2); + movesdone = movesdone + 1; +} + +void +tower (i, j, k) + int i, j, k; +{ + int other; + if (k == 1) + move (i, j); + else + { + other = 6 - i - j; + tower (i, other, k - 1); + move (i, j); + tower (other, j, k - 1); + } +} + + +void +towers () +{ + int i; + for (i = 1; i <= maxcells; i++) + cellspace[i].next = i - 1; + freelist = maxcells; + init (1, 14); + makenull (2); + makenull (3); + movesdone = 0; + tower (1, 2, 14); + if (movesdone != 16383) + printf (" error in Towers.\n"); +} + +#ifndef LOOP +#define LOOP 500 +#endif + +int +main () +{ + int i; + for (i= 0; i < LOOP; i++) + towers(); + return 0; +} + diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/README b/tests/Regression/RHEL6Feature-cpp-backtraces/README new file mode 100644 index 0000000..3211489 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/README @@ -0,0 +1,31 @@ + +With 5.18.0-0.rc5.20220504git107c948d1d3e61d.42.fc37.x86_64 we have + + + +---------------------8<-------------------------------------------------------- +:: [ 08:26:39 ] :: [ BEGIN ] :: Running 'stap --skip-badvars --ldd backtrackator.stp -c ./classes > output.out' +In file included from /usr/share/systemtap/runtime/linux/../regs.c:20, + from /usr/share/systemtap/runtime/linux/runtime.h:270, + from /usr/share/systemtap/runtime/runtime.h:26, + from /tmp/stap7hYYpn/stap_9beffd9064cc2c18ddd2daf7f47a7e44_5966_src.c:21: +/usr/share/systemtap/runtime/stack.c: In function ‘_stp_stack_unwind_one_kernel’: +/usr/share/systemtap/runtime/linux/../linux/regs.c:23:32: error: ‘struct kretprobe_instance’ has no member named ‘ret_addr’ + 23 | #define _stp_ret_addr_r(ri) (ri->ret_addr) + | ^~ +/usr/share/systemtap/runtime/stack.c:358:47: note: in expansion of macro ‘_stp_ret_addr_r’ + 358 | return (unsigned long)_stp_ret_addr_r(c->ips.krp.pi); + | ^~~~~~~~~~~~~~~ +make[1]: *** [scripts/Makefile.build:288: /tmp/stap7hYYpn/stap_9beffd9064cc2c18ddd2daf7f47a7e44_5966_src.o] Error 1 +make[1]: *** Waiting for unfinished jobs.... +make: *** [Makefile:1844: /tmp/stap7hYYpn] Error 2 +WARNING: kbuild exited with status: 2 +Pass 4: compilation failed. [man error::pass4] +:: [ 08:26:59 ] :: [ FAIL ] :: Command 'stap --skip-badvars --ldd backtrackator.stp -c ./classes > output.out' (Expected 0, got 1) +---------------------8<-------------------------------------------------------- + + +Related to CONFIG_KRETPROBE_ON_RETHOOK https://elixir.bootlin.com/linux/v5.18-rc5/source/include/linux/kprobes.h#L163 + + +Needs fixing on the stap side. diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/backtrackator.stp b/tests/Regression/RHEL6Feature-cpp-backtraces/backtrackator.stp new file mode 100644 index 0000000..18a4248 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/backtrackator.stp @@ -0,0 +1,15 @@ +function mypr:long(){ + printf("================================================================================\n"); + printf("Probed function: [%s]\n\n", probefunc()); + printf ("Backtrace:\n"); + + print_ubacktrace(); + return 0; +} + + + +probe process("classes").function("public*") { mypr(); } +probe process("classes").function("private*") { mypr(); } +probe process("classes").function("recursive*") { mypr(); } +probe process("classes").function("main*") { mypr(); } diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/classes.cpp b/tests/Regression/RHEL6Feature-cpp-backtraces/classes.cpp new file mode 100644 index 0000000..1c42084 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/classes.cpp @@ -0,0 +1,43 @@ +#include "classes.hpp" +#include + +void A::privateA1(){ + std::cout << "privateA1" << std::endl; + this->privateA2(); + +} + +void A::privateA2(){ + std::cout << "privateA2" << std::endl; + this->recursiveA1(3); + +} + +void A::recursiveA1(int count){ + std::cout << "recursiveA1: " << count << std::endl; + if (count == 0) + return; + this->recursiveA1(count-1); + return; +} + +void A::publicA1(){ + std::cout << "publicA1" << std::endl; + this->publicA2(); +} + +void A::publicA2(){ + std::cout << "publicA2" << std::endl; + this->privateA1(); +} + + +void B::privateB1(A a){ + std::cout << "privateB1" << std::endl; + a.publicA1(); +} + +void B::publicB1(A a){ + std::cout << "publicB1" << std::endl; + this->privateB1(a); +} diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/classes.hpp b/tests/Regression/RHEL6Feature-cpp-backtraces/classes.hpp new file mode 100644 index 0000000..0846ae2 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/classes.hpp @@ -0,0 +1,16 @@ +class A{ + private: + void privateA1(); + void privateA2(); + void recursiveA1(int); + public: + void publicA1(); + void publicA2(); +}; + +class B{ + private: + void privateB1(A); + public: + void publicB1(A); +}; diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden-ppc64-17.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden-ppc64-17.out new file mode 100644 index 0000000..1a9d1ce --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden-ppc64-17.out @@ -0,0 +1,142 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : generic_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden-ppc64.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden-ppc64.out new file mode 100644 index 0000000..0f98c88 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden-ppc64.out @@ -0,0 +1,76 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +[ADDRESS] [ADDRESS] ADDRESS (inexact) diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden-s390x.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden-s390x.out new file mode 100644 index 0000000..1f5f902 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden-s390x.out @@ -0,0 +1,65 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.aarch64.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.aarch64.out new file mode 100644 index 0000000..15c7b1e --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.aarch64.out @@ -0,0 +1,153 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.ppc64le.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.ppc64le.out new file mode 100644 index 0000000..64f2232 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.ppc64le.out @@ -0,0 +1,142 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.17+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.s390x.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.s390x.out new file mode 100644 index 0000000..c0c1262 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.s390x.out @@ -0,0 +1,153 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.x86_64.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.x86_64.out new file mode 100644 index 0000000..ac8d8c9 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.el9.x86_64.out @@ -0,0 +1,153 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_call_main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main@GLIBC_2.2.5+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/golden.out b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.out new file mode 100644 index 0000000..5013977 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/golden.out @@ -0,0 +1,142 @@ +publicB1 +privateB1 +publicA1 +publicA2 +privateA1 +privateA2 +recursiveA1: 3 +recursiveA1: 2 +recursiveA1: 1 +recursiveA1: 0 +================================================================================ +Probed function: [main] + +Backtrace: + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicB1] + +Backtrace: + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateB1] + +Backtrace: + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA1] + +Backtrace: + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [publicA2] + +Backtrace: + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA1] + +Backtrace: + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [privateA2] + +Backtrace: + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] +================================================================================ +Probed function: [recursiveA1] + +Backtrace: + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : recursiveA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA2+ADDRESS/ADDRESS [PATH] + ADDRESS : privateA1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA2+ADDRESS/ADDRESS [PATH] + ADDRESS : publicA1+ADDRESS/ADDRESS [PATH] + ADDRESS : privateB1+ADDRESS/ADDRESS [PATH] + ADDRESS : publicB1+ADDRESS/ADDRESS [PATH] + ADDRESS : main+ADDRESS/ADDRESS [PATH] + ADDRESS : __libc_start_main+ADDRESS/ADDRESS [PATH] + ADDRESS : _start+ADDRESS/ADDRESS [PATH] diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/main.cpp b/tests/Regression/RHEL6Feature-cpp-backtraces/main.cpp new file mode 100644 index 0000000..69ae514 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/main.cpp @@ -0,0 +1,10 @@ +#include "classes.hpp" + +int main(){ + A a; + B b; + + b.publicB1(a); + return 0; +} + diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/main.fmf b/tests/Regression/RHEL6Feature-cpp-backtraces/main.fmf new file mode 100644 index 0000000..3600214 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/main.fmf @@ -0,0 +1,14 @@ +summary: Tests backtracking in C++ programs +description: '' +contact: Petr Muller +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - gcc-c++ + - glibc-debuginfo +duration: 10m +extra-summary: /tools/systemtap/Regression/RHEL6Feature-cpp-backtraces +extra-task: /tools/systemtap/Regression/RHEL6Feature-cpp-backtraces diff --git a/tests/Regression/RHEL6Feature-cpp-backtraces/runtest.sh b/tests/Regression/RHEL6Feature-cpp-backtraces/runtest.sh new file mode 100755 index 0000000..eddbc83 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-backtraces/runtest.sh @@ -0,0 +1,116 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/RHEL6Feature-cpp-backtraces +# Description: Tests backtracking in C++ programs +# Author: Petr Muller +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2010 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include rhts environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +inputAs_rlLog(){ + while read line + do + rlLog "$line" + done +} + +compareAndLog(){ + rlAssertNotDiffer "$1" "$2" + if [ "$?" != "0" ] + then + rlLog "Difference:" + diff -u "$1" "$2" | inputAs_rlLog + fi +} + +rlJournalStart + +rlPhaseStartSetup + rlRun "g++ classes.cpp main.cpp -g -o classes" + rlAssertRpm glibc # show NVR + rlAssertRpm glibc-debuginfo + rlRun "stap-prep" 0-255 +rlPhaseEnd + +rlPhaseStartTest + rlRun "stap --ldd backtrackator.stp -c ./classes > output.out" + rlRun "cp output.out unprocessed.out" + rlLog "Processing output" + rlRun "sed -i -r -e 's/0x[0-9a-f]+/ADDRESS/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*publicA1[A-Za-z0-9]*/publicA1/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*publicA2[A-Za-z0-9]*/publicA2/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*privateA1[A-Za-z0-9]*/privateA1/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*privateA2[A-Za-z0-9]*/privateA2/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*recursiveA1[A-Za-z0-9]*/recursiveA1/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*publicB1[A-Za-z0-9]*/publicB1/g' output.out" + rlRun "sed -i -r -e 's/_[_A-Za-z0-9]*privateB1[A-Za-z0-9]*/privateB1/g' output.out" + rlRun "sed -i -r -e 's!\[((.*\/.*)|(classes))\]!\[PATH\]!g' output.out" + # http://stackoverflow.com/questions/13963150/what-does-the-gcc-function-suffix-isra-mean + rlIsRHEL '>=' 7 && arch | grep -q ppc && \ + rlRun "sed -i 's/generic_start_main.isra.0/generic_start_main/' output.out" + + if rlIsRHEL '>=' 9; then + [[ "`uname -m`" =~ "ppc64" ]] && \ + rlRun "cat golden.el9.`arch`.out > golden-ppc64-17.out" || \ + rlRun "cat golden.el9.`arch`.out > golden.out" + fi + + # RHEL-9 s390x runtime/stack-s390.c:63:52: error: ‘ASYNC_SIZE’ undeclared + # (PAGE_SIZE << 1) on stap side seems to work it around + + + if [ "`uname -m`" == "s390x" ] && ( rlIsRHEL 5 || rlIsRHEL 4 ) + then + rlLog "Detected we are running on: s390x && RHEL <= 5" + rlLog "Using special expected output" + compareAndLog golden-s390x.out output.out + elif [ "`uname -m`" == "ppc64" ] && ( rlIsRHEL 5 || rlIsRHEL 4 ) + then + rlLog "Detected we are running on: ppc64 && RHEL <= 5" + rlLog "Using special expected output" + compareAndLog golden-ppc64.out output.out + elif [[ "`uname -m`" =~ "ppc64" ]] + then + rlLog "Detected we are running on: ppc64" + rlLog "Using special expected output" + compareAndLog golden-ppc64-17.out output.out + else + rlLog "Detected we are running on: nothing special" + rlLog "Using generic expected output" + compareAndLog golden.out output.out + fi +rlPhaseEnd + +rlPhaseStartCleanup + rlFileSubmit output.out + rlFileSubmit golden.out + rlFileSubmit unprocessed.out + rlRun "rm -f classes output.out unprocessed.out" +rlPhaseEnd + +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/classes.cpp b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/classes.cpp new file mode 100644 index 0000000..cd488c5 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/classes.cpp @@ -0,0 +1,39 @@ +#include + +class Explicit{ + public: + int data; + Explicit(); + Explicit(int argument); + Explicit(const Explicit &original); + ~Explicit(); +}; + +class Implicit{ + public: + int data; +}; + +Explicit::Explicit() { this->data=0; } +Explicit::Explicit(int a) {this->data=0; } +Explicit::Explicit(const Explicit &orig){this->data = orig.data;} +Explicit::~Explicit(){} + +int main(){ + Explicit e1; //static ctor call + Explicit *e2; + + e2 = new Explicit(); //dynamic ctor call + delete e2; //dynamic dtor call + + e2 = new Explicit(2); //dynamic ctor call + Explicit e3 = *e2; //copy ctor + delete e2; //dtor + + Implicit i1; //ctor + Implicit *i2 = new Implicit(); //ctor + Implicit i3 = *i2; //implicit copy ctor + delete i2; //dtor + + return 0; // dtor e1, e3, i1, i3 +} diff --git a/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/golden.out b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/golden.out new file mode 100644 index 0000000..f45ff90 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/golden.out @@ -0,0 +1,16 @@ +Explicit constructor start +Explicit constructor end +Explicit constructor start +Explicit constructor end +Explicit destructor start +Explicit destructor end +Explicit constructor start +Explicit constructor end +Explicit constructor start +Explicit constructor end +Explicit destructor start +Explicit destructor end +Explicit destructor start +Explicit destructor end +Explicit destructor start +Explicit destructor end diff --git a/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/main.fmf b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/main.fmf new file mode 100644 index 0000000..ba18df9 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/main.fmf @@ -0,0 +1,13 @@ +summary: Tests probing constructors and destructors +description: '' +contact: Petr Muller +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - gcc-c++ +duration: 5m +extra-summary: /tools/systemtap/Regression/RHEL6Feature-cpp-ctors-and-dtors +extra-task: /tools/systemtap/Regression/RHEL6Feature-cpp-ctors-and-dtors diff --git a/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/runtest.sh b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/runtest.sh new file mode 100755 index 0000000..fc72f6b --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/runtest.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/RHEL6Feature-cpp-ctors-and-dtors +# Description: Tests probing constructors and destructors +# Author: Petr Muller +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2010 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include rhts environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + +rlPhaseStartSetup + rlRun "g++ classes.cpp -g -o classes" +rlPhaseEnd + +rlPhaseStartTest + rlRun "stap -c ./classes tracker.stp -o output.out" + rlAssertNotDiffer golden.out output.out +rlPhaseEnd + +rlPhaseStartCleanup + rlFileSubmit "output.out" + rlFileSubmit "golden.out" + rlRun "rm -rf classes output.out" +rlPhaseEnd + +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/tracker.stp b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/tracker.stp new file mode 100644 index 0000000..8ff0bb1 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-ctors-and-dtors/tracker.stp @@ -0,0 +1,23 @@ +probe process("classes").function("Explicit::Explicit"){ + printf("Explicit constructor start\n"); +} + +probe process("classes").function("Explicit::~Explicit"){ + printf("Explicit destructor start\n"); +} + +probe process("classes").function("Explicit::Explicit").return{ + printf("Explicit constructor end\n"); +} + +probe process("classes").function("Explicit::~Explicit").return{ + printf("Explicit destructor end\n"); +} + +//probe process("classes").function("Implicit::Implicit"){ +// printf("Implicitconstructor\n"); +//} + +//probe process("classes").function("Implicit::Implicit"){ +// printf("Implicit constructor\n"); +//} diff --git a/tests/Regression/RHEL6Feature-cpp-inheritance/classes.cpp b/tests/Regression/RHEL6Feature-cpp-inheritance/classes.cpp new file mode 100644 index 0000000..2ab3e54 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-inheritance/classes.cpp @@ -0,0 +1,56 @@ +#include + +class A{ + public: + void one(){ std::cout << "A::one" << std::endl; } + void two(){ std::cout << "A::two" << std::endl; } + virtual void three() { std::cout << "A::three" << std::endl; } + virtual void four() { std::cout << "A::four" << std::endl; } +}; + +class B : public A{ + public: + void one() { std::cout << "B::one" << std::endl; } + int one(int a) { std::cout << "B::one" << std::endl; } + + virtual void three() { std::cout << "B::three" << std::endl; } +}; + +int main(){ + A a; + B b; + + A *ap = new A(); + A *apb = new B(); + + B *bp = new B(); + + + a.one(); + a.two(); + a.three(); + a.four(); + + b.one(); + b.two(); + b.three(); + b.four(); + + ap->one(); + ap->two(); + ap->three(); + ap->four(); + + apb->one(); + apb->two(); + apb->three(); + apb->four(); + + bp->one(); + bp->two(); + bp->three(); + bp->four(); + + + return 0; +} diff --git a/tests/Regression/RHEL6Feature-cpp-inheritance/main.fmf b/tests/Regression/RHEL6Feature-cpp-inheritance/main.fmf new file mode 100644 index 0000000..dba249b --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-inheritance/main.fmf @@ -0,0 +1,13 @@ +summary: Tests systemtap handling inheritance +description: '' +contact: Petr Muller +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - gcc-c++ +duration: 10m +extra-summary: /tools/systemtap/Regression/RHEL6Feature-cpp-inheritance +extra-task: /tools/systemtap/Regression/RHEL6Feature-cpp-inheritance diff --git a/tests/Regression/RHEL6Feature-cpp-inheritance/runtest.sh b/tests/Regression/RHEL6Feature-cpp-inheritance/runtest.sh new file mode 100755 index 0000000..deec9ce --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-inheritance/runtest.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/RHEL6Feature-cpp-inheritance +# Description: Tests systemtap handling inheritance +# Author: Petr Muller +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2010 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include rhts environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +# if this testcase caused kernel crash and reboot, don't try to rerun it +[[ $REBOOTCOUNT -gt 0 ]] && exit 1 + +PACKAGE="systemtap" + +rlJournalStart + +rlPhaseStartSetup + rlRun "g++ classes.cpp -o classes -g" + rlRun "./classes > program.out" 0 "Preparing the golden output" +rlPhaseEnd + +rlPhaseStartTest + rlRun "stap -c ./classes tracker.stp -o stap.out" + rlAssertNotDiffer program.out stap.out +rlPhaseEnd + +rlPhaseStartCleanup + rlFileSubmit program.out + rlFileSubmit stap.out + rlRun "rm -f classes stap.out program.out" +rlPhaseEnd + +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/RHEL6Feature-cpp-inheritance/tracker.stp b/tests/Regression/RHEL6Feature-cpp-inheritance/tracker.stp new file mode 100644 index 0000000..525ced5 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-inheritance/tracker.stp @@ -0,0 +1,6 @@ +probe process("classes").function("A::one"){printf("A::one\n");} +probe process("classes").function("A::two"){printf("A::two\n");} +probe process("classes").function("A::three"){printf("A::three\n");} +probe process("classes").function("A::four"){printf("A::four\n");} +probe process("classes").function("B::one"){printf("B::one\n");} +probe process("classes").function("B::three"){printf("B::three\n");} diff --git a/tests/Regression/RHEL6Feature-cpp-methods/classes.cpp b/tests/Regression/RHEL6Feature-cpp-methods/classes.cpp new file mode 100644 index 0000000..e947234 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/classes.cpp @@ -0,0 +1,71 @@ +__attribute__((noinline)) void StandaloneFunction(){ + +} + +class CLASS1{ + private: + void prMethod() {}; + public: + void puMethod() {this->prMethod();}; + static void stMethod() {}; +}; + +namespace inner{ + void StandaloneFunction(){ + } + + class CLASS1{ + private: + void prMethod() {}; + public: + void puMethod() {this->prMethod();}; + static void stMethod() {}; + }; +}; + +namespace moreinner{ + void StandaloneFunction(){ + } + + class CLASS1{ + private: + __attribute__((noinline)) void prMethod() {}; + public: + __attribute__((noinline)) void puMethod() {this->prMethod();}; + __attribute__((noinline)) static void stMethod() {}; + }; +}; + +int main(){ + StandaloneFunction(); + inner::StandaloneFunction(); + moreinner::StandaloneFunction(); + + CLASS1 A; + inner::CLASS1 B; + moreinner::CLASS1 C; + + CLASS1* pA = new CLASS1(); + inner::CLASS1 *pB = new inner::CLASS1(); + moreinner::CLASS1 *pC = new moreinner::CLASS1(); + + A.puMethod(); + A.stMethod(); + + B.puMethod(); + B.stMethod(); + + C.puMethod(); + C.stMethod(); + + pA->puMethod(); + pA->stMethod(); + + pB->puMethod(); + pB->stMethod(); + + pC->puMethod(); + pC->stMethod(); + + return 0; +} diff --git a/tests/Regression/RHEL6Feature-cpp-methods/golden.el7.out b/tests/Regression/RHEL6Feature-cpp-methods/golden.el7.out new file mode 100644 index 0000000..d7cff12 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/golden.el7.out @@ -0,0 +1,70 @@ +StandaloneFunction start: _Z18StandaloneFunctionv +StandaloneFunction end: main +StandaloneFunction start: _ZN5inner18StandaloneFunctionEv +inner::StandaloneFunction start: _ZN5inner18StandaloneFunctionEv +StandaloneFunction end: main +inner::StandaloneFunction end: main +StandaloneFunction start: _ZN9moreinner18StandaloneFunctionEv +moreinner::StandaloneFunction start: _ZN9moreinner18StandaloneFunctionEv +StandaloneFunction end: main +moreinner::StandaloneFunction end: main +puMethod start: _ZN6CLASS18puMethodEv +prMethod start: _ZN6CLASS18prMethodEv +prMethod end: _ZN6CLASS18puMethodEv +puMethod end: main +stMethod start: _ZN6CLASS18stMethodEv +stMethod end: main +puMethod start: _ZN5inner6CLASS18puMethodEv +inner::puMethod start: _ZN5inner6CLASS18puMethodEv +prMethod start: _ZN5inner6CLASS18prMethodEv +inner::prMethod start: _ZN5inner6CLASS18prMethodEv +prMethod end: _ZN5inner6CLASS18puMethodEv +inner::prMethod end: _ZN5inner6CLASS18puMethodEv +puMethod end: main +inner::puMethod end: main +stMethod start: _ZN5inner6CLASS18stMethodEv +inner::stMethod start: _ZN5inner6CLASS18stMethodEv +stMethod end: main +inner::stMethod end: main +puMethod start: _ZN9moreinner6CLASS18puMethodEv +moreinner::puMethod start: _ZN9moreinner6CLASS18puMethodEv +prMethod start: _ZN9moreinner6CLASS18prMethodEv +moreinner::prMethod start: _ZN9moreinner6CLASS18prMethodEv +prMethod end: _ZN9moreinner6CLASS18puMethodEv +moreinner::prMethod end: _ZN9moreinner6CLASS18puMethodEv +puMethod end: main +moreinner::puMethod end: main +stMethod start: _ZN9moreinner6CLASS18stMethodEv +moreinner::stMethod start: _ZN9moreinner6CLASS18stMethodEv +stMethod end: main +moreinner::stMethod end: main +puMethod start: _ZN6CLASS18puMethodEv +prMethod start: _ZN6CLASS18prMethodEv +prMethod end: _ZN6CLASS18puMethodEv +puMethod end: main +stMethod start: _ZN6CLASS18stMethodEv +stMethod end: main +puMethod start: _ZN5inner6CLASS18puMethodEv +inner::puMethod start: _ZN5inner6CLASS18puMethodEv +prMethod start: _ZN5inner6CLASS18prMethodEv +inner::prMethod start: _ZN5inner6CLASS18prMethodEv +prMethod end: _ZN5inner6CLASS18puMethodEv +inner::prMethod end: _ZN5inner6CLASS18puMethodEv +puMethod end: main +inner::puMethod end: main +stMethod start: _ZN5inner6CLASS18stMethodEv +inner::stMethod start: _ZN5inner6CLASS18stMethodEv +stMethod end: main +inner::stMethod end: main +puMethod start: _ZN9moreinner6CLASS18puMethodEv +moreinner::puMethod start: _ZN9moreinner6CLASS18puMethodEv +prMethod start: _ZN9moreinner6CLASS18prMethodEv +moreinner::prMethod start: _ZN9moreinner6CLASS18prMethodEv +prMethod end: _ZN9moreinner6CLASS18puMethodEv +moreinner::prMethod end: _ZN9moreinner6CLASS18puMethodEv +puMethod end: main +moreinner::puMethod end: main +stMethod start: _ZN9moreinner6CLASS18stMethodEv +moreinner::stMethod start: _ZN9moreinner6CLASS18stMethodEv +stMethod end: main +moreinner::stMethod end: main diff --git a/tests/Regression/RHEL6Feature-cpp-methods/golden.el8.out b/tests/Regression/RHEL6Feature-cpp-methods/golden.el8.out new file mode 100644 index 0000000..6ba6bc9 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/golden.el8.out @@ -0,0 +1,83 @@ +StandaloneFunction start: _Z18StandaloneFunctionv +StandaloneFunction end: main +StandaloneFunction start: _ZN5inner18StandaloneFunctionEv +inner::StandaloneFunction start: _ZN5inner18StandaloneFunctionEv +StandaloneFunction end: main +inner::StandaloneFunction end: main +StandaloneFunction start: _ZN9moreinner18StandaloneFunctionEv +moreinner::StandaloneFunction start: _ZN9moreinner18StandaloneFunctionEv +StandaloneFunction end: main +moreinner::StandaloneFunction end: main +puMethod start: _ZN6CLASS18puMethodEv +prMethod start: _ZN6CLASS18prMethodEv +prMethod end: _ZN6CLASS18puMethodEv +puMethod end: main +stMethod start: _ZN6CLASS18stMethodEv +stMethod end: main +puMethod start: _ZN5inner6CLASS18puMethodEv +inner::puMethod start: _ZN5inner6CLASS18puMethodEv +prMethod start: _ZN5inner6CLASS18prMethodEv +inner::prMethod start: _ZN5inner6CLASS18prMethodEv +prMethod end: _ZN5inner6CLASS18puMethodEv +inner::prMethod end: _ZN5inner6CLASS18puMethodEv +puMethod end: main +inner::puMethod end: main +stMethod start: _ZN5inner6CLASS18stMethodEv +inner::stMethod start: _ZN5inner6CLASS18stMethodEv +stMethod end: main +inner::stMethod end: main +puMethod start: _ZN9moreinner6CLASS18puMethodEv +moreinner::puMethod start: _ZN9moreinner6CLASS18puMethodEv +prMethod start: _ZN9moreinner6CLASS18prMethodEv +moreinner::prMethod start: _ZN9moreinner6CLASS18prMethodEv +prMethod end: _ZN9moreinner6CLASS18puMethodEv +moreinner::prMethod end: _ZN9moreinner6CLASS18puMethodEv +puMethod end: main +moreinner::puMethod end: main +stMethod start: _ZN9moreinner6CLASS18stMethodEv +moreinner::stMethod start: _ZN9moreinner6CLASS18stMethodEv +stMethod end: main +moreinner::stMethod end: main +puMethod start: _ZN6CLASS18puMethodEv +prMethod start: _ZN6CLASS18prMethodEv +prMethod end: _ZN6CLASS18puMethodEv +puMethod end: main +stMethod start: _ZN6CLASS18stMethodEv +stMethod end: main +puMethod start: _ZN5inner6CLASS18puMethodEv +inner::puMethod start: _ZN5inner6CLASS18puMethodEv +prMethod start: _ZN5inner6CLASS18prMethodEv +inner::prMethod start: _ZN5inner6CLASS18prMethodEv +prMethod end: _ZN5inner6CLASS18puMethodEv +inner::prMethod end: _ZN5inner6CLASS18puMethodEv +puMethod end: main +inner::puMethod end: main +stMethod start: _ZN5inner6CLASS18stMethodEv +inner::stMethod start: _ZN5inner6CLASS18stMethodEv +stMethod end: main +inner::stMethod end: main +puMethod start: _ZN9moreinner6CLASS18puMethodEv +moreinner::puMethod start: _ZN9moreinner6CLASS18puMethodEv +prMethod start: _ZN9moreinner6CLASS18prMethodEv +moreinner::prMethod start: _ZN9moreinner6CLASS18prMethodEv +prMethod end: _ZN9moreinner6CLASS18puMethodEv +moreinner::prMethod end: _ZN9moreinner6CLASS18puMethodEv +puMethod end: main +moreinner::puMethod end: main +stMethod start: _ZN9moreinner6CLASS18stMethodEv +moreinner::stMethod start: _ZN9moreinner6CLASS18stMethodEv +stMethod end: main +moreinner::stMethod end: main +__StandaloneFunction=0 +__hitcount=70 +__inner_StandaloneFunction=0 +__moreinner_StandaloneFunction=0 +__stMethod=0 +__inner_CLASS1_stMethod=0 +__moreinner_star_stMethod=0 +__prMethod=0 +__inner_CLASS1_prMethod=0 +__moreinner_star_prMethod=0 +__puMethod=0 +__inner_CLASS1_puMethod=0 +__moreinner_star_puMethod=0 diff --git a/tests/Regression/RHEL6Feature-cpp-methods/golden.out b/tests/Regression/RHEL6Feature-cpp-methods/golden.out new file mode 100644 index 0000000..fe9c7bb --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/golden.out @@ -0,0 +1,70 @@ +StandaloneFunction start: StandaloneFunction +StandaloneFunction end: StandaloneFunction +StandaloneFunction start: StandaloneFunction +inner::StandaloneFunction start: inner::StandaloneFunction +inner::StandaloneFunction end: inner::StandaloneFunction +StandaloneFunction end: StandaloneFunction +StandaloneFunction start: StandaloneFunction +moreinner::StandaloneFunction start: moreinner::StandaloneFunction +moreinner::StandaloneFunction end: moreinner::StandaloneFunction +StandaloneFunction end: StandaloneFunction +puMethod start: puMethod +prMethod start: prMethod +prMethod end: prMethod +puMethod end: puMethod +stMethod start: stMethod +stMethod end: stMethod +puMethod start: puMethod +inner::puMethod start: inner::CLASS1::puMethod +prMethod start: prMethod +inner::prMethod start: inner::CLASS1::prMethod +inner::prMethod end: inner::CLASS1::prMethod +prMethod end: prMethod +inner::puMethod end: inner::CLASS1::puMethod +puMethod end: puMethod +stMethod start: stMethod +inner::stMethod start: inner::CLASS1::stMethod +inner::stMethod end: inner::CLASS1::stMethod +stMethod end: stMethod +puMethod start: puMethod +moreinner::puMethod start: moreinner::CLASS1::puMethod +prMethod start: prMethod +moreinner::prMethod start: moreinner::CLASS1::prMethod +moreinner::prMethod end: moreinner::CLASS1::prMethod +prMethod end: prMethod +moreinner::puMethod end: moreinner::CLASS1::puMethod +puMethod end: puMethod +stMethod start: stMethod +moreinner::stMethod start: moreinner::CLASS1::stMethod +moreinner::stMethod end: moreinner::CLASS1::stMethod +stMethod end: stMethod +puMethod start: puMethod +prMethod start: prMethod +prMethod end: prMethod +puMethod end: puMethod +stMethod start: stMethod +stMethod end: stMethod +puMethod start: puMethod +inner::puMethod start: inner::CLASS1::puMethod +prMethod start: prMethod +inner::prMethod start: inner::CLASS1::prMethod +inner::prMethod end: inner::CLASS1::prMethod +prMethod end: prMethod +inner::puMethod end: inner::CLASS1::puMethod +puMethod end: puMethod +stMethod start: stMethod +inner::stMethod start: inner::CLASS1::stMethod +inner::stMethod end: inner::CLASS1::stMethod +stMethod end: stMethod +puMethod start: puMethod +moreinner::puMethod start: moreinner::CLASS1::puMethod +prMethod start: prMethod +moreinner::prMethod start: moreinner::CLASS1::prMethod +moreinner::prMethod end: moreinner::CLASS1::prMethod +prMethod end: prMethod +moreinner::puMethod end: moreinner::CLASS1::puMethod +puMethod end: puMethod +stMethod start: stMethod +moreinner::stMethod start: moreinner::CLASS1::stMethod +moreinner::stMethod end: moreinner::CLASS1::stMethod +stMethod end: stMethod diff --git a/tests/Regression/RHEL6Feature-cpp-methods/golden_summary.out b/tests/Regression/RHEL6Feature-cpp-methods/golden_summary.out new file mode 100644 index 0000000..4072ed7 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/golden_summary.out @@ -0,0 +1,13 @@ +__hitcount=70 +__inner_CLASS1_prMethod=0 +__inner_CLASS1_puMethod=0 +__inner_CLASS1_stMethod=0 +__inner_StandaloneFunction=0 +__moreinner_StandaloneFunction=0 +__moreinner_star_prMethod=0 +__moreinner_star_puMethod=0 +__moreinner_star_stMethod=0 +__prMethod=0 +__puMethod=0 +__StandaloneFunction=0 +__stMethod=0 diff --git a/tests/Regression/RHEL6Feature-cpp-methods/main.fmf b/tests/Regression/RHEL6Feature-cpp-methods/main.fmf new file mode 100644 index 0000000..56ac081 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/main.fmf @@ -0,0 +1,13 @@ +summary: Tests C++ methods +description: '' +contact: Petr Muller +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - gcc-c++ +duration: 120m +extra-summary: /tools/systemtap/Regression/RHEL6Feature-cpp-methods +extra-task: /tools/systemtap/Regression/RHEL6Feature-cpp-methods diff --git a/tests/Regression/RHEL6Feature-cpp-methods/runtest.sh b/tests/Regression/RHEL6Feature-cpp-methods/runtest.sh new file mode 100755 index 0000000..443ff56 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/runtest.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/RHEL6Feature-cpp-methods +# Description: Tests C++ methods +# Author: Petr Muller +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2010 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include rhts environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + +rlPhaseStartSetup + rlRun "stap-prep" 0-255 + rlRun "g++ -O0 classes.cpp -o classes -g" + + rlIsRHEL 6 && COMPAT='--compatible=1.8' + # rlIsRHEL 7 && cp -f golden.el7.out golden.out + # rlIsRHEL 8 && cp -f golden.el8.out golden.out +rlPhaseEnd + +rlPhaseStartTest + rlRun "stap $COMPAT -c ./classes tracker.stp -o output.out" + # Stop comparing literally against a golden file, + # do a sanity check instead. The literal golden file check + # sort of regressed between rhel-8.2 and rhel-8.3 + # rlRun "diff golden.out output.out" + rlRun "grep ^__ output.out | sort > summary.out" + + # RHEL6: covert hex to dec: + rlRun "sed -i 's/0x0/0/' summary.out" + rlRun "sed -i 's/0x46/70/' summary.out" + + # Sanity check + rlRun "diff golden_summary.out summary.out" || ( + rlRun "cat golden_summary.out" + rlRun "cat summary.out" + ) +rlPhaseEnd + +rlPhaseStartCleanup + rlFileSubmit golden.out + rlFileSubmit output.out + + rlRun "rm -f output.out classes" +rlPhaseEnd + +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/RHEL6Feature-cpp-methods/tracker.stp b/tests/Regression/RHEL6Feature-cpp-methods/tracker.stp new file mode 100644 index 0000000..54e15b3 --- /dev/null +++ b/tests/Regression/RHEL6Feature-cpp-methods/tracker.stp @@ -0,0 +1,162 @@ +global __hitcount = 0 +global __StandaloneFunction = 0 +global __inner_StandaloneFunction = 0 +global __moreinner_StandaloneFunction = 0 +global __stMethod = 0 +global __inner_CLASS1_stMethod = 0 +global __moreinner_star_stMethod = 0 +global __prMethod = 0 +global __inner_CLASS1_prMethod = 0 +global __moreinner_star_prMethod = 0 +global __puMethod = 0 +global __inner_CLASS1_puMethod = 0 +global __moreinner_star_puMethod = 0 + +probe process("classes").function("StandaloneFunction").call{ + __StandaloneFunction++ + __hitcount++ + printf("StandaloneFunction start: %s\n", probefunc()); +} + +probe process("classes").function("StandaloneFunction").return{ + __StandaloneFunction-- + __hitcount++ + printf("StandaloneFunction end: %s\n", probefunc()); +} + +probe process("classes").function("inner::StandaloneFunction").call{ + __inner_StandaloneFunction++ + __hitcount++ + printf("inner::StandaloneFunction start: %s\n", probefunc()); +} + +probe process("classes").function("inner::StandaloneFunction").return{ + __inner_StandaloneFunction-- + __hitcount++ + printf("inner::StandaloneFunction end: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::StandaloneFunction").call{ + __moreinner_StandaloneFunction++ + __hitcount++ + printf("moreinner::StandaloneFunction start: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::StandaloneFunction").return{ + __moreinner_StandaloneFunction-- + __hitcount++ + printf("moreinner::StandaloneFunction end: %s\n", probefunc()); +} +// ============================================================================ +probe process("classes").function("stMethod").call{ + __stMethod++ + __hitcount++ + printf("stMethod start: %s\n", probefunc()); +} + +probe process("classes").function("stMethod").return{ + __stMethod-- + __hitcount++ + printf("stMethod end: %s\n", probefunc()); +} + +probe process("classes").function("inner::CLASS1::stMethod").call{ + __inner_CLASS1_stMethod++ + __hitcount++ + printf("inner::stMethod start: %s\n", probefunc()); +} + +probe process("classes").function("inner::CLASS1::stMethod").return{ + __inner_CLASS1_stMethod-- + __hitcount++ + printf("inner::stMethod end: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::*::stMethod").call{ + __moreinner_star_stMethod++ + __hitcount++ + printf("moreinner::stMethod start: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::*::stMethod").return{ + __moreinner_star_stMethod-- + __hitcount++ + printf("moreinner::stMethod end: %s\n", probefunc()); +} +//============================================================================= + +probe process("classes").function("prMethod").call{ + __prMethod++ + __hitcount++ + printf("prMethod start: %s\n", probefunc()); +} + +probe process("classes").function("prMethod").return{ + __prMethod-- + __hitcount++ + printf("prMethod end: %s\n", probefunc()); +} + +probe process("classes").function("inner::CLASS1::prMethod").call{ + __inner_CLASS1_prMethod++ + __hitcount++ + printf("inner::prMethod start: %s\n", probefunc()); +} + +probe process("classes").function("inner::CLASS1::prMethod").return{ + __inner_CLASS1_prMethod-- + __hitcount++ + printf("inner::prMethod end: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::*::prMethod").call{ + __moreinner_star_prMethod++ + __hitcount++ + printf("moreinner::prMethod start: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::*::prMethod").return{ + __moreinner_star_prMethod-- + __hitcount++ + printf("moreinner::prMethod end: %s\n", probefunc()); +} + +//============================================================================= + +probe process("classes").function("puMethod").call{ + __puMethod++ + __hitcount++ + printf("puMethod start: %s\n", probefunc()); +} + +probe process("classes").function("puMethod").return{ + __puMethod-- + __hitcount++ + printf("puMethod end: %s\n", probefunc()); +} + +probe process("classes").function("inner::CLASS1::puMethod").call{ + __inner_CLASS1_puMethod++ + __hitcount++ + printf("inner::puMethod start: %s\n", probefunc()); +} + +probe process("classes").function("inner::CLASS1::puMethod").return{ + __inner_CLASS1_puMethod-- + __hitcount++ + printf("inner::puMethod end: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::*::puMethod").call{ + __moreinner_star_puMethod++ + __hitcount++ + printf("moreinner::puMethod start: %s\n", probefunc()); +} + +probe process("classes").function("moreinner::*::puMethod").return{ + __moreinner_star_puMethod-- + __hitcount++ + printf("moreinner::puMethod end: %s\n", probefunc()); +} + + diff --git a/tests/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap/main.fmf b/tests/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap/main.fmf new file mode 100644 index 0000000..33847c6 --- /dev/null +++ b/tests/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap/main.fmf @@ -0,0 +1,14 @@ +summary: Test for BZ#1572501 (RHEL7.5 - backtraces no longer work with systemtap) +description: Test for BZ#1572501 +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1572501 +extra-summary: /tools/systemtap/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap +extra-task: /tools/systemtap/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap diff --git a/tests/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap/runtest.sh b/tests/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap/runtest.sh new file mode 100755 index 0000000..a4b1a26 --- /dev/null +++ b/tests/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap/runtest.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/RHEL7-5-backtraces-no-longer-work-with-systemtap +# Description: Test for BZ#1572501 (RHEL7.5 - backtraces no longer work with systemtap) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartTest + if arch | grep -q s390x; then + rlLogWarning "Test not relevant" + else + TEMPFILE=$(mktemp) + rlRun "stap --all-modules -vwe 'probe kernel.function(\"kmem_cache_alloc\") { print_backtrace(); exit() }' >& $TEMPFILE" + # since it's hard to find some reasonable pattern to grep for across arches in the backrtrace + # we'll simply count the lines. We'll want at least 9 lines of output (6 as the results of -v, + # and another at least three coming from the backtrace itself. + rlRun "cat $TEMPFILE" + rlRun "test 9 -le $(wc -l $TEMPFILE | awk '{print $1}')" + rm $TEMPFILE + fi + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/bz544960-no-cfa_ops-supplied/README b/tests/Regression/bz544960-no-cfa_ops-supplied/README new file mode 100644 index 0000000..f1152ea --- /dev/null +++ b/tests/Regression/bz544960-no-cfa_ops-supplied/README @@ -0,0 +1,63 @@ +Kernel porting needed. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Test +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:: [ 09:22:47 ] :: [ INFO ] :: Checking whether we might want to try prologue search. +:: [ 09:23:10 ] :: [ BEGIN ] :: Running 'stap -P -vp4 readpages.stp' +Pass 1: parsed user script and 484 library scripts using 122428virt/95036res/15532shr/79120data kb, in 200usr/110sys/315real ms. +WARNING: never-assigned local variable 'nr_pages' (similar: rpages, __page, dev, name, file): identifier 'nr_pages' at readpages.stp:5:26 + source: printf("nr_pages=%d\n", nr_pages); + ^ +WARNING: never-assigned local variable 'rpages' (similar: nr_pages, __page, dev, name, rsize): identifier 'rpages' at :7:24 + source: printf("rpages=%d\n", rpages); + ^ +Pass 2: analyzed script: 2 probes, 17 functions, 3 embeds, 0 globals using 351676virt/327836res/19060shr/308368data kb, in 2880usr/1970sys/4927real ms. +Pass 3: translated to C into "/tmp/stapWU958g/stap_f189533513b6d61221ada924fedfc9c4_6369_src.c" using 351692virt/327964res/19188shr/308384data kb, in 490usr/800sys/1301real ms. +In file included from /usr/share/systemtap/runtime/linux/../regs.c:16, + from /usr/share/systemtap/runtime/linux/runtime.h:270, + from /usr/share/systemtap/runtime/runtime.h:26, + from /tmp/stapWU958g/stap_f189533513b6d61221ada924fedfc9c4_6369_src.c:21: +/tmp/stapWU958g/stap_f189533513b6d61221ada924fedfc9c4_6369_src.c: In function ‘enter_kretprobe_common’: +/tmp/stapWU958g/stap_f189533513b6d61221ada924fedfc9c4_6369_src.c:2499:45: error: ‘struct kretprobe_instance’ has no member named ‘ret_addr’ + 2499 | SET_REG_IP(regs, (unsigned long)inst->ret_addr); + | ^~ +/usr/share/systemtap/runtime/linux/../regs.h:85:44: note: in definition of macro ‘SET_REG_IP’ + 85 | #define SET_REG_IP(regs, x) REG_IP(regs) = x + | ^ +make[1]: *** [scripts/Makefile.build:288: /tmp/stapWU958g/stap_f189533513b6d61221ada924fedfc9c4_6369_src.o] Error 1 +make: *** [Makefile:1844: /tmp/stapWU958g] Error 2 +WARNING: kbuild exited with status: 2 +Pass 4: compiled C into "stap_f189533513b6d61221ada924fedfc9c4_6369.ko" in 1150usr/1910sys/2659real ms. +Pass 4: compilation failed. [man error::pass4] +:: [ 09:23:20 ] :: [ FAIL ] :: Command 'stap -P -vp4 readpages.stp' (Expected 0, got 1) +:: [ 09:23:20 ] :: [ BEGIN ] :: Running 'stap -P -vp4 tcp.sendmsg.stp' +Pass 1: parsed user script and 484 library scripts using 122428virt/95044res/15536shr/79120data kb, in 180usr/130sys/316real ms. +Pass 2: analyzed script: 5 probes, 2 functions, 4 embeds, 3 globals using 202292virt/178300res/19224shr/158984data kb, in 1720usr/1750sys/3531real ms. +Pass 3: translated to C into "/tmp/stapzXlpka/stap_c98d0598383a49c9b0a715336e876a54_18911_src.c" using 202308virt/178492res/19416shr/159000data kb, in 160usr/720sys/899real ms. +In file included from /usr/share/systemtap/runtime/linux/../regs.c:16, + from /usr/share/systemtap/runtime/linux/runtime.h:270, + from /usr/share/systemtap/runtime/runtime.h:26, + from /tmp/stapzXlpka/stap_c98d0598383a49c9b0a715336e876a54_18911_src.c:21: +/tmp/stapzXlpka/stap_c98d0598383a49c9b0a715336e876a54_18911_src.c: In function ‘enter_kretprobe_common’: +/tmp/stapzXlpka/stap_c98d0598383a49c9b0a715336e876a54_18911_src.c:2190:45: error: ‘struct kretprobe_instance’ has no member named ‘ret_addr’ + 2190 | SET_REG_IP(regs, (unsigned long)inst->ret_addr); + | ^~ +/usr/share/systemtap/runtime/linux/../regs.h:85:44: note: in definition of macro ‘SET_REG_IP’ + 85 | #define SET_REG_IP(regs, x) REG_IP(regs) = x + | ^ +make[1]: *** [scripts/Makefile.build:288: /tmp/stapzXlpka/stap_c98d0598383a49c9b0a715336e876a54_18911_src.o] Error 1 +make: *** [Makefile:1844: /tmp/stapzXlpka] Error 2 +WARNING: kbuild exited with status: 2 +Pass 4: compiled C into "stap_c98d0598383a49c9b0a715336e876a54_18911.ko" in 1250usr/1900sys/2762real ms. +Pass 4: compilation failed. [man error::pass4] +:: [ 09:23:28 ] :: [ FAIL ] :: Command 'stap -P -vp4 tcp.sendmsg.stp' (Expected 0, got 1) +:: [ 09:23:28 ] :: [ BEGIN ] :: Running 'stap -P -vp4 bdflush.stp' +Pass 1: parsed user script and 484 library scripts using 122428virt/94968res/15468shr/79120data kb, in 180usr/130sys/317real ms. +Pass 2: analyzed script: 3 probes, 5 functions, 98 embeds, 4 globals using 198116virt/174376res/18956shr/154808data kb, in 1930usr/2660sys/4689real ms. +/root/.systemtap/cache/87/stap_8728db2fdfe761c96d8963fd0c4fffd2_71969.ko +Pass 3: using cached /root/.systemtap/cache/87/stap_8728db2fdfe761c96d8963fd0c4fffd2_71969.c +Pass 4: using cached /root/.systemtap/cache/87/stap_8728db2fdfe761c96d8963fd0c4fffd2_71969.ko +:: [ 09:23:33 ] :: [ PASS ] :: Command 'stap -P -vp4 bdflush.stp' (Expected 0, got 0) + diff --git a/tests/Regression/bz544960-no-cfa_ops-supplied/bdflush.stp b/tests/Regression/bz544960-no-cfa_ops-supplied/bdflush.stp new file mode 100644 index 0000000..e38c685 --- /dev/null +++ b/tests/Regression/bz544960-no-cfa_ops-supplied/bdflush.stp @@ -0,0 +1,8 @@ +probe syscall.bdflush { + printf("%s\n", name) + printf("%s\n", argstr) +} + +probe syscall.bdflush.return { + printf("%s\n", name) +} diff --git a/tests/Regression/bz544960-no-cfa_ops-supplied/main.fmf b/tests/Regression/bz544960-no-cfa_ops-supplied/main.fmf new file mode 100644 index 0000000..bab475f --- /dev/null +++ b/tests/Regression/bz544960-no-cfa_ops-supplied/main.fmf @@ -0,0 +1,14 @@ +summary: bz544960-no-cfa_ops-supplied +description: '' +contact: Martin Hatina +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 30m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=544960 +extra-summary: /tools/systemtap/Regression/bz544960-no-cfa_ops-supplied +extra-task: /tools/systemtap/Regression/bz544960-no-cfa_ops-supplied diff --git a/tests/Regression/bz544960-no-cfa_ops-supplied/readpages.stp b/tests/Regression/bz544960-no-cfa_ops-supplied/readpages.stp new file mode 100644 index 0000000..7ff57b4 --- /dev/null +++ b/tests/Regression/bz544960-no-cfa_ops-supplied/readpages.stp @@ -0,0 +1,19 @@ +probe nfs.aop.readpages !, nfs.aop.readpage { + log(name); + printf("dev=%d\n", dev); + printf("ino=%d\n", ino); + printf("nr_pages=%d\n", nr_pages); + printf("file=%d\n", file); + printf("rpages=%d\n", rpages); + printf("rsize=%d\n", rsize); + printf("argstr=%s\n", argstr); + printf("size=%d\n", size); + printf("units=%s\n", units); +} + +probe nfs.aop.readpages.return !, nfs.aop.readpage.return { + log(name); + printf("retstr=%s\n", retstr); + printf("size=%d\n", size); + printf("units=%s\n", units); +} diff --git a/tests/Regression/bz544960-no-cfa_ops-supplied/runtest.sh b/tests/Regression/bz544960-no-cfa_ops-supplied/runtest.sh new file mode 100755 index 0000000..4be6581 --- /dev/null +++ b/tests/Regression/bz544960-no-cfa_ops-supplied/runtest.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/bz544960-no-cfa_ops-supplied +# Description: What the test does +# Author: Martin Hatina +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" +_SCRIPTS="readpages.stp tcp.sendmsg.stp bdflush.stp" + +rlJournalStart + rlPhaseStartTest + rlLogInfo "Checking whether we might want to try prologue search." + p="" + for s in $_SCRIPTS; do + stap -vp4 $s >& /dev/null || p="-P" + done + + for s in $_SCRIPTS; do + rlRun "stap $p -vp4 $s" + done + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/bz544960-no-cfa_ops-supplied/tcp.sendmsg.stp b/tests/Regression/bz544960-no-cfa_ops-supplied/tcp.sendmsg.stp new file mode 100644 index 0000000..1cb95b3 --- /dev/null +++ b/tests/Regression/bz544960-no-cfa_ops-supplied/tcp.sendmsg.stp @@ -0,0 +1,7 @@ +probe tcp.sendmsg { + printf("%d\n", size) +} + +probe tcp.sendmsg.return { + printf("%d\n", size) +} diff --git a/tests/Regression/bz706185-various-build-and-run/main.fmf b/tests/Regression/bz706185-various-build-and-run/main.fmf new file mode 100644 index 0000000..3d6770a --- /dev/null +++ b/tests/Regression/bz706185-various-build-and-run/main.fmf @@ -0,0 +1,15 @@ +summary: bz706185-various-build-and-run +description: bz706185-various-build-and-run +contact: Petr Muller +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +require: +recommend: + - systemtap +duration: 20m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=706185 +extra-summary: /tools/systemtap/Regression/bz706185-various-build-and-run +extra-task: /tools/systemtap/Regression/bz706185-various-build-and-run diff --git a/tests/Regression/bz706185-various-build-and-run/runtest.sh b/tests/Regression/bz706185-various-build-and-run/runtest.sh new file mode 100755 index 0000000..447c049 --- /dev/null +++ b/tests/Regression/bz706185-various-build-and-run/runtest.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/bz706185-various-build-and-run +# Description: Test containing several build and run testcases. +# Author: Petr Muller +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2011 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh + +PACKAGE="systemtap" + +rlJournalStart +rlPhaseStartSetup + rlRun "rpm -qf $(which stap)" + rlRun "uname -r" +rlPhaseEnd + +rlPhaseStartTest "Build testcases" + export STAPOUT=`mktemp` + export TRACOUT=`mktemp` + for testcase in *.stp + do + rlLog "Testcase: $testcase" + rlRun "stap -v -p4 $testcase -m testcase --poison-cache &>$STAPOUT" 0 "Building testcase: $testcase" + if [ $? -ne 0 ] + then + rlLog "=== systemtap output start" + while read line + do + rlLog "$line" + done < $STAPOUT + rlLog "=== systemtap output end" + fi + rm -f testcase.ko + rm -f $STAPOUT + done +rlPhaseEnd + +rlPhaseStartTest "Run testcases" + for testcase in *.run + do + rlLog "Testcase: $testcase" + COMMAND="`cat $testcase`" + COMMAND="$COMMAND -o $TRACOUT $testcase --poison-cache &>$STAPOUT" + rlLog "Assembled command: [$COMMAND]" + rlRun "$COMMAND" 0 "Running testcase: $testcase" + if [ $? -ne 0 ] + then + rlLog "=== systemtap output start" + while read line; do rlLog "$line"; done < $STAPOUT + rlLog "=== systemtap output end" + rlLog "" + rlLog "=== tracing output start" + while read line; do rlLog "$line"; done < $TRACOUT + rlLog "=== tracing output end" + fi + rm -f $STAPOUT $TRACOUT + done +rlPhaseEnd + +rlPhaseStartCleanup + rlRun "rm -f $STAPOUT $TRACOUT" +rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/bz706185-various-build-and-run/softirq.run b/tests/Regression/bz706185-various-build-and-run/softirq.run new file mode 100644 index 0000000..e609cd5 --- /dev/null +++ b/tests/Regression/bz706185-various-build-and-run/softirq.run @@ -0,0 +1 @@ +stap -v softirq.stp diff --git a/tests/Regression/bz706185-various-build-and-run/softirq.stp b/tests/Regression/bz706185-various-build-and-run/softirq.stp new file mode 100644 index 0000000..347b840 --- /dev/null +++ b/tests/Regression/bz706185-various-build-and-run/softirq.stp @@ -0,0 +1,3 @@ +probe softirq.entry { println(">>> softirq") } +probe softirq.exit { println("<<< softirq")} +probe timer.ms(5000) { exit() } diff --git a/tests/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code/main.fmf b/tests/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code/main.fmf new file mode 100644 index 0000000..05c4212 --- /dev/null +++ b/tests/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code/main.fmf @@ -0,0 +1,15 @@ +summary: dtrace-create-Wall-Wextra-pedantic-clean-code +description: dtrace-create-Wall-Wextra-pedantic-clean-code +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - systemtap-sdt-devel +duration: 5m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=902739 +extra-summary: /tools/systemtap/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code +extra-task: /tools/systemtap/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code diff --git a/tests/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code/runtest.sh b/tests/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code/runtest.sh new file mode 100755 index 0000000..d76f4c5 --- /dev/null +++ b/tests/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code/runtest.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/dtrace-create-Wall-Wextra-pedantic-clean-code +# Description: dtrace-create-Wall-Wextra-pedantic-clean-code +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPDIR=$(mktemp -d)" + rlRun "pushd $TMPDIR" + rlPhaseEnd + + rlPhaseStart WARN "Info" + rlRun "which dtrace" + rlPhaseEnd + + rlPhaseStartTest + rlRun "printf \"provider xxx { probe xxx(); };\n\" > xxx" + rlRun "dtrace -G -k -s xxx &> dtrace.out" + rlRun "cat dtrace.out" + rlRun "CF=$( awk '/^source:/ {print $2}' dtrace.out )" + rlRun "gcc -c -Wall -Wextra -pedantic $CF 2>&1 | tee gcc.out" + rlRun "grep -i warning gcc.out" 1 + rlRun "grep -i error gcc.out" 1 + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/elfutils-debuginfod-client-not-being-called/dotest.sh b/tests/Regression/elfutils-debuginfod-client-not-being-called/dotest.sh new file mode 100644 index 0000000..a1d48fb --- /dev/null +++ b/tests/Regression/elfutils-debuginfod-client-not-being-called/dotest.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -xe + +rm -rf ~/.cache/debuginfod_client ~/.systemtap ||: + +debuginfod -p 8008 -d $(mktemp) -vvvvv >& debuginfod.log & +PID=$! + +sleep 5 + +export SYSTEMTAP_DEBUGINFO_PATH=/tmp +export DEBUGINFOD_URLS="http://127.0.0.1:8008" + +# The following doesn't work on aarch64 and s390x because of: +# https://sourceware.org/bugzilla/show_bug.cgi?id=25498 +# stap -p2 -e 'probe kernel.function("vfs_read") {println(pp())}' ||: + +stap -p2 -e 'probe process("/bin/true").function("main") {println(pp())}' -c /bin/true ||: + +sleep 5 + +kill -9 $PID + +grep 'started http server on' debuginfod.log +grep 'searching for buildid=[a-z0-9]* artifacttype=debuginfo' debuginfod.log + + diff --git a/tests/Regression/elfutils-debuginfod-client-not-being-called/main.fmf b/tests/Regression/elfutils-debuginfod-client-not-being-called/main.fmf new file mode 100644 index 0000000..2ae6333 --- /dev/null +++ b/tests/Regression/elfutils-debuginfod-client-not-being-called/main.fmf @@ -0,0 +1,14 @@ +summary: elfutils-debuginfod-client-not-being-called +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - elfutils-debuginfod +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1778921 +extra-summary: /tools/systemtap/Regression/elfutils-debuginfod-client-not-being-called +extra-task: /tools/systemtap/Regression/elfutils-debuginfod-client-not-being-called diff --git a/tests/Regression/elfutils-debuginfod-client-not-being-called/runtest.sh b/tests/Regression/elfutils-debuginfod-client-not-being-called/runtest.sh new file mode 100755 index 0000000..79d9197 --- /dev/null +++ b/tests/Regression/elfutils-debuginfod-client-not-being-called/runtest.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/elfutils-debuginfod-client-not-being-called +# Description: elfutils-debuginfod-client-not-being-called +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2020 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm $PACKAGE + rlRun "TMP=$(mktemp -d)" + rlRun "cp dotest.sh $TMP/" + rlRun "pushd $TMP" + rlPhaseEnd + + rlPhaseStartTest + rlRun "bash dotest.sh" || + rlRun "cat debuginfod.log" + rlFileSubmit debuginfod.log + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMP" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/hellotrace.stp b/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/hellotrace.stp new file mode 100644 index 0000000..e390200 --- /dev/null +++ b/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/hellotrace.stp @@ -0,0 +1,8 @@ +probe begin +{ + printf ( "hello trace : printf\n") + printk (20,"hello trace : printk") + ftrace ( "hello trace : ftrace\n") + exit () +} + diff --git a/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/main.fmf b/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/main.fmf new file mode 100644 index 0000000..96bcab2 --- /dev/null +++ b/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/main.fmf @@ -0,0 +1,14 @@ +summary: ftrace-logging-tapset-not-working-as-expected-in +description: ftrace-logging-tapset-not-working-as-expected-in +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1810216 +extra-summary: /tools/systemtap/Regression/ftrace-logging-tapset-not-working-as-expected-in +extra-task: /tools/systemtap/Regression/ftrace-logging-tapset-not-working-as-expected-in diff --git a/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/runtest.sh b/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/runtest.sh new file mode 100755 index 0000000..4d3a759 --- /dev/null +++ b/tests/Regression/ftrace-logging-tapset-not-working-as-expected-in/runtest.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/ftrace-logging-tapset-not-working-as-expected-in +# Description: ftrace-logging-tapset-not-working-as-expected-in +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2020 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +LOG1=$(mktemp) +LOG2=$(mktemp) + +rlJournalStart + rlPhaseStartTest + rlRun "mount | fgrep -i 'debugfs on'" + rlRun "cat /sys/kernel/debug/tracing/tracing_on | grep '^1$'" + rlRun "journalctl > $LOG1" + rlRun "stap -g -k -v hellotrace.stp" + rlRun "journalctl > $LOG2" + rlRun "diff $LOG1 $LOG2 | grep '^>.*hello trace : printk'" + rlRun "rm $LOG1 $LOG2" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/ipv6-tapset-support/main.fmf b/tests/Regression/ipv6-tapset-support/main.fmf new file mode 100644 index 0000000..9d08d89 --- /dev/null +++ b/tests/Regression/ipv6-tapset-support/main.fmf @@ -0,0 +1,16 @@ +summary: Test for BZ#822503 (ipv6 tapset support) +description: ipv6 tapset support +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - nfs-utils + - setup +duration: 50m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=822503 +extra-summary: /tools/systemtap/Regression/ipv6-tapset-support +extra-task: /tools/systemtap/Regression/ipv6-tapset-support diff --git a/tests/Regression/ipv6-tapset-support/nfsd.proc.lookup.stp b/tests/Regression/ipv6-tapset-support/nfsd.proc.lookup.stp new file mode 100755 index 0000000..86db264 --- /dev/null +++ b/tests/Regression/ipv6-tapset-support/nfsd.proc.lookup.stp @@ -0,0 +1,12 @@ +#!/usr/bin/stap + +# http://sourceware.org/systemtap/examples/network/nfsdtop.stp + +probe nfsd.proc.lookup { + printf("%s %s\n", client_ip, filename); +} + +probe timer.ms(100000) { + exit (); +} + diff --git a/tests/Regression/ipv6-tapset-support/runtest.sh b/tests/Regression/ipv6-tapset-support/runtest.sh new file mode 100755 index 0000000..62fa775 --- /dev/null +++ b/tests/Regression/ipv6-tapset-support/runtest.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/ipv6-tapset-support +# Description: Test for BZ#822503 (ipv6 tapset support) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm nfs-utils + rlRun "uname -r" + rlRun "which stap" + + rlRun "TMPD=$(mktemp -d --tmpdir=$HOME tmp.XXXXXXX)" + rlRun "mkdir $TMPD/{A,B}" + rlRun "chmod --recursive 0777 $TMPD" + rlRun "STAPLOG=$(mktemp)" + + rlServiceStart rpcbind + sleep 5 + NFS_SERVICE=nfs + rlIsRHEL '>=8' && NFS_SERVICE=nfs-server + rlServiceStart $NFS_SERVICE + sleep 10 + rlRun "exportfs -ua" + rlRun "exportfs -i -o 'rw,no_root_squash' *:$TMPD/A" + rlPhaseEnd + + rlPhaseStartTest + # ======= work around bz1605574 + rlLogInfo "Let's check if we can compile the module." + rlLogInfo "In case we can't, we'll go ahead with prologue searching." + set -x + EXTRA_SWITCHES='' + stap -p4 nfsd.proc.lookup.stp || EXTRA_SWITCHES="-P" + set +x + # ============================= + + # mount is sufficient to invoke nfsd.proc.lookup + rlRun "stap $EXTRA_SWITCHES -v -c 'mount -t nfs -v [::1]:$TMPD/A $TMPD/B' nfsd.proc.lookup.stp |& tee $STAPLOG" + rlRun "umount $TMPD/B" + rlRun "grep 'Unsupported Address Family' $STAPLOG" 1 + rlRun "egrep '^\[0000:0000:0000:0000:0000:0000:0000:0001\]:[0-9]+.*$(basename $TMPD)' $STAPLOG" + rlPhaseEnd + + rlPhaseStartCleanup + rlServiceRestore $NFS_SERVICE + rlServiceRestore rpcbind + rlRun "rm -rf $TMPD $STAPLOG" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/irq-vector-tracepoints/main.fmf b/tests/Regression/irq-vector-tracepoints/main.fmf new file mode 100644 index 0000000..c9ec663 --- /dev/null +++ b/tests/Regression/irq-vector-tracepoints/main.fmf @@ -0,0 +1,15 @@ +summary: irq-vector-tracepoints +description: irq-vector-tracepoints +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap-devel + - kernel-debuginfo +duration: 15m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1020437 +extra-summary: /tools/systemtap/Regression/irq-vector-tracepoints +extra-task: /tools/systemtap/Regression/irq-vector-tracepoints diff --git a/tests/Regression/irq-vector-tracepoints/runtest.sh b/tests/Regression/irq-vector-tracepoints/runtest.sh new file mode 100755 index 0000000..9b88712 --- /dev/null +++ b/tests/Regression/irq-vector-tracepoints/runtest.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/irq-vector-tracepoints +# Description: irq-vector-tracepoints +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPDIR=$(mktemp -d)" + rlRun "pushd $TMPDIR" + rlRun "mount -t debugfs /dev/null /sys/kernel/debug" 0-255 + rlRun "test -d /sys/kernel/debug/tracing/events" + rlPhaseEnd + + rlPhaseStart FAIL "Systemtap sanity check" + rlRun "stap --version" + rlRun "stap -v -e 'probe kernel.function(\"vfs_read\"){ exit() }'" + rlPhaseEnd + + rlPhaseStart FAIL "Create list of all kernel tracepoints known to stap" + rlRun "stap -l 'kernel.trace(\"*\")' > tracepoints" + rlFileSubmit tracepoints + rlPhaseEnd + + rlPhaseStart FAIL "Check irq_vectors" + dir='/sys/kernel/debug/tracing/events/irq_vectors' + if test -d $dir; then + for p in $( find $dir -mindepth 1 -type d | awk -F\/ '{print $NF}' ); do + rlLogInfo "Checking $p" + rlRun "grep -q $p tracepoints" + done + # additional checks + rlRun "stap -vp4 -e 'probe kernel.trace(\"local_timer_entry\") {println(pp())}'" + rlRun "stap -vp4 -e 'probe kernel.trace(\"reschedule_entry\") {println(pp())}'" + else + if arch | egrep 'x86_64|i[36]86'; then + rlLogError "$dir does not exist" + else + rlLogInfo "$dir does not exist" + fi + fi + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/netdev-receive/main.fmf b/tests/Regression/netdev-receive/main.fmf new file mode 100644 index 0000000..78ec038 --- /dev/null +++ b/tests/Regression/netdev-receive/main.fmf @@ -0,0 +1,14 @@ +summary: netdev.receive +description: bz1518462 netdev.receive +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 15m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1518462 +extra-summary: /tools/systemtap/Regression/netdev-receive +extra-task: /tools/systemtap/Regression/netdev-receive diff --git a/tests/Regression/netdev-receive/runtest.sh b/tests/Regression/netdev-receive/runtest.sh new file mode 100755 index 0000000..b184941 --- /dev/null +++ b/tests/Regression/netdev-receive/runtest.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/netdev-receive +# Description: netdev.receive +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" +TMPFILE=$(mktemp) + +rlJournalStart + rlPhaseStartTest + # Here we rely on that netdev.receive gets hit immediately without us explicitly triggering it. + # Not all rhel-7 stap versions have -T already, so we use -E instead. + rlRun "stap -o $TMPFILE -ve 'probe netdev.receive{log(\"HIT\") exit()}' -E 'probe timer.s(10) {log(\"TIMEOUT\") exit()}'" + rlRun "cat $TMPFILE" + rlRun "grep HIT $TMPFILE" + rlRun "grep TIMEOUT $TMPFILE" 1 + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/pass-4-failure-netfilter-examples/main.fmf b/tests/Regression/pass-4-failure-netfilter-examples/main.fmf new file mode 100644 index 0000000..5244e99 --- /dev/null +++ b/tests/Regression/pass-4-failure-netfilter-examples/main.fmf @@ -0,0 +1,16 @@ +summary: Test for BZ#1055778 (Pass 4 failure on RHEL7 for examples) +description: Test for BZ#1055778 (Pass 4 failure on RHEL7 for examples) +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - valgrind + - systemtap + - systemtap-testsuite +duration: 30m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1055778 +extra-summary: /tools/systemtap/Regression/pass-4-failure-netfilter-examples +extra-task: /tools/systemtap/Regression/pass-4-failure-netfilter-examples diff --git a/tests/Regression/pass-4-failure-netfilter-examples/runtest.sh b/tests/Regression/pass-4-failure-netfilter-examples/runtest.sh new file mode 100755 index 0000000..2eed9af --- /dev/null +++ b/tests/Regression/pass-4-failure-netfilter-examples/runtest.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/pass-4-failure-netfilter-examples +# Description: Test for BZ#1055778 (Pass 4 failure on RHEL7 for examples) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartSetup + TESTS=$(mktemp) + rlRun "rpm -qa | fgrep systemtap-testsuite" + rlPhaseEnd + + rpm -qa | grep systemtap-testsuite | xargs rpm -ql \ + | egrep 'netfilter_drop.stp|netfilter_summary.stp' \ + | while read line; do + rlPhaseStart FAIL "Testing $line" + rlRun "stap -p4 $line -v -g TCP 1" && \ + echo $line >> $TESTS + rlPhaseEnd + done + + rlPhaseStart FAIL "Check what was tested" + rlRun "grep netfilter_drop.stp $TESTS" + rlRun "grep netfilter_summary.stp $TESTS" + rm -f $TESTS + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/python-probing/list.stp b/tests/Regression/python-probing/list.stp new file mode 100755 index 0000000..f68e700 --- /dev/null +++ b/tests/Regression/python-probing/list.stp @@ -0,0 +1,22 @@ +#!/usr/bin/stap -v +/* + Example usage of the Python systemtap tapset to show a nested view of all + Python function calls (and returns) across the whole system. + + Run this using + stap systemtap-example.stp + to instrument all Python processes on the system, or (for example) using + stap systemtap-example.stp -c COMMAND + to instrument a specific program (implemented in Python) +*/ +probe python.function.entry +{ + if ( filename =~ "random" ) + printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename, lineno); +} + +probe python.function.return +{ + if ( filename =~ "random" ) + printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename, lineno); +} diff --git a/tests/Regression/python-probing/main.fmf b/tests/Regression/python-probing/main.fmf new file mode 100644 index 0000000..55b3281 --- /dev/null +++ b/tests/Regression/python-probing/main.fmf @@ -0,0 +1,19 @@ +summary: Systemtap static probes test +description: Systemtap static probes test +contact: Petr Splichal +component: +- python +- systemtap +test: ./runtest.sh +framework: beakerlib +recommend: +- python +- python-debuginfo +- systemtap +- python2 +- python3 +- elfutils +duration: 15m +extra-summary: /CoreOS/python/Sanity/systemtap +extra-task: /CoreOS/python/Sanity/systemtap +tier: 1 diff --git a/tests/Regression/python-probing/runtest.sh b/tests/Regression/python-probing/runtest.sh new file mode 100755 index 0000000..5ead47e --- /dev/null +++ b/tests/Regression/python-probing/runtest.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /CoreOS/python/Sanity/systemtap +# Description: Systemtap static probes test +# Author: Petr Splichal +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2011 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include rhts environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +# Packages to be tested +PACKAGES="${PACKAGES:-python3}" +# Other required packages +REQUIRES=${REQUIRES:-} +# Binary name parametrized +PYTHON="${PYTHON:-python3}" + +package=$(rpm -qf --queryformat '%{name}\n' $(which $PYTHON)) +collection_path=$(which python | sed 's/\/usr\/bin\/python//') + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm --all + rlAssertRpm "systemtap" + rlLogInfo "Running on kernel: $(uname -r)" + rlRun "rpm -qa 'systemtap*'" 0 "Checking systemtap packages" + rlRun "TmpDir=\`mktemp -d\`" 0 "Creating tmp directory" + rlRun "cp list.stp top.stp test.py $TmpDir" 0 "Copying scripts" + rlRun "pushd $TmpDir" + rlPhaseEnd + + rlPhaseStartTest "Verifying ELF file for presence of .probes section" + for lib in ${collection_path}/usr/lib*/libpython*.so.* ; do + rlRun "eu-readelf -x .probes $lib" \ + 0 "Checking for .probes section within $lib" + done + rlPhaseEnd + + # Note that typically you need to be root to run "stap" (or be within + # an appropriate group) + for script in list top; do + rlPhaseStartTest "Test $script" + rlRun "rm -rf ~/.systemtap/cache" 0 "Cleaning cache" + rlRun "stap $script.stp -v -c \"$PYTHON test.py\" > $script" \ + 0 "Testing with $script.stp" + rlRun "tail -100 $script | col -b" 0 "Inspecting output" + rlRun "grep '/usr/lib.*python.*random.py' '$script'" \ + 0 "Checking for random in the $script output" + rlPhaseEnd + done + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TmpDir" 0 "Removing tmp directory" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/python-probing/test.py b/tests/Regression/python-probing/test.py new file mode 100755 index 0000000..65cc0b7 --- /dev/null +++ b/tests/Regression/python-probing/test.py @@ -0,0 +1,3 @@ +import random, time +print(random.random()) +time.sleep(3) diff --git a/tests/Regression/python-probing/top.stp b/tests/Regression/python-probing/top.stp new file mode 100755 index 0000000..f32fbf9 --- /dev/null +++ b/tests/Regression/python-probing/top.stp @@ -0,0 +1,19 @@ +#!/usr/bin/stap -v + +global fn_calls; + +probe python.function.entry +{ + fn_calls[pid(), filename, funcname, lineno] += 1; +} + +probe timer.ms(1000) { + foreach ([pid, filename, funcname, lineno] in fn_calls- limit 1000) { + if (filename =~ "random") + printf("%6d %80s %6d %30s %6d\n", + pid, filename, lineno, funcname, + fn_calls[pid, filename, funcname, lineno]); + } + + delete fn_calls; +} diff --git a/tests/Regression/second-command-not-captured/main.fmf b/tests/Regression/second-command-not-captured/main.fmf new file mode 100644 index 0000000..7b88ecc --- /dev/null +++ b/tests/Regression/second-command-not-captured/main.fmf @@ -0,0 +1,16 @@ +summary: second-command-not-captured +description: second-command-not-captured +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - ruby + - ruby-libs +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1857749 +extra-summary: /tools/systemtap/Regression/second-command-not-captured +extra-task: /tools/systemtap/Regression/second-command-not-captured diff --git a/tests/Regression/second-command-not-captured/ruby-exercise.stp b/tests/Regression/second-command-not-captured/ruby-exercise.stp new file mode 100644 index 0000000..8c5f42b --- /dev/null +++ b/tests/Regression/second-command-not-captured/ruby-exercise.stp @@ -0,0 +1,9 @@ +probe ruby.method.entry, ruby.cmethod.entry { + if((classname =~ "Array") && (methodname =~ "push")) + printf("%d -> %s::%s %s:%d\n", tid(), classname, methodname, file, line); +} + +probe ruby.method.return, ruby.cmethod.return { + if((classname =~ "Array") && (methodname =~ "push")) + printf("%d <- %s::%s %s:%d\n", tid(), classname, methodname, file, line); +} diff --git a/tests/Regression/second-command-not-captured/runtest.sh b/tests/Regression/second-command-not-captured/runtest.sh new file mode 100755 index 0000000..65a749f --- /dev/null +++ b/tests/Regression/second-command-not-captured/runtest.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/second-command-not-captured +# Description: second-command-not-captured +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2020 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartTest + rlLog "`which stap`" + rlLog "`stap -V`" + rlRun "stap -v ./ruby-exercise.stp -c ./test.sh -o stap.log" + rlRun "grep 'Array::push' stap.log" || + rlFileSubmit "stap.log" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/second-command-not-captured/test.sh b/tests/Regression/second-command-not-captured/test.sh new file mode 100755 index 0000000..d308ba2 --- /dev/null +++ b/tests/Regression/second-command-not-captured/test.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +ruby -e 'puts "ABC"' +ruby -e '[1, 2, 3].push(4)' +sleep 10 diff --git a/tests/Regression/selected-parts-of-upstream-testsuite/main.fmf b/tests/Regression/selected-parts-of-upstream-testsuite/main.fmf new file mode 100644 index 0000000..a1d57ec --- /dev/null +++ b/tests/Regression/selected-parts-of-upstream-testsuite/main.fmf @@ -0,0 +1,23 @@ +summary: selected-parts-of-upstream-testsuite +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - libstdc++ + - dejagnu + - elfutils-devel + - gettext + - libgcc + - glibc-devel + - gcc-c++ + - libstdc++-devel + - dyninst + - dyninst-devel + - systemtap-testsuite +duration: 48h +extra-summary: /tools/systemtap/Regression/selected-parts-of-upstream-testsuite +extra-task: /tools/systemtap/Regression/selected-parts-of-upstream-testsuite diff --git a/tests/Regression/selected-parts-of-upstream-testsuite/runtest.sh b/tests/Regression/selected-parts-of-upstream-testsuite/runtest.sh new file mode 100755 index 0000000..7c2882b --- /dev/null +++ b/tests/Regression/selected-parts-of-upstream-testsuite/runtest.sh @@ -0,0 +1,184 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/selected-parts-of-upstream-testsuite +# Description: selected-parts-of-upstream-testsuite +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Be tolerant about selinux +export AVC_ERROR='+no_avc_check' + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +DMESG1=$(mktemp) +DMESG2=$(mktemp) + +PACKAGE="systemtap" + +SUBTESTS="\ +attach_detach.exp \ +bz1126645.exp \ +bz1214176.exp \ +bz1252436.exp \ +exelib.exp \ +pr22005.exp \ +server.exp \ +systemtap-service.exp \ +task_dentry_path.exp \ +task_paths.exp \ +tracepoints.exp \ +" + +blacklist_subtest() +{ + token=${1/\//\\/} + SUBTESTS=${SUBTESTS/$token/} +} + +P4TESTS="\ +buildok/nfs-all-probes.stp \ +buildok/nfs-detailed.stp \ +buildok/nfs-fop.check_flags.stp \ +buildok/nfs_proc-detailed.stp \ +buildok/nfsd-all-probes.stp \ +buildok/nfsd-detailed.stp \ +systemtap.examples/io/nfs_func_users.stp \ +systemtap.examples/network/nfsdtop.stp \ +" + +blacklist_p4() +{ + token=${1/\//\\/} + P4TESTS=${P4TESTS/$token/} +} + +if [[ $(rpm --eval '%{rhel}') -ge 8 ]]; then + # mjw authored that testcase - had been notified + arch | fgrep 'x86_64' && blacklist_subtest 'exelib.exp' + + blacklist_p4 'buildok/nfs-fop.check_flags.stp' + blacklist_p4 'buildok/nfs_proc-detailed.stp' + blacklist_p4 'buildok/nfsd-detailed.stp' + # bz1709831 + blacklist_p4 'buildok/nfs-detailed.stp' + arch | fgrep -q ppc64le && blacklist_p4 'buildok/nfs-all-probes.stp' +elif [[ $(rpm --eval '%{rhel}') -eq 7 ]]; then + # RHEL-ALT + if rpm -qi kernel | fgrep -q kernel-alt; then + # at_var.exp is expected to fail on Pegas - https://bugzilla.redhat.com/show_bug.cgi?id=1165848#c7 + blacklist_subtest 'at_var.exp' + fi + + # bz1107616, bz1698737 + blacklist_p4 'buildok/nfsd-detailed.stp' + if arch | fgrep -q ppc64le; then + blacklist_p4 'buildok/nfs-all-probes.stp' + blacklist_p4 'buildok/nfs-detailed.stp' + blacklist_p4 'buildok/nfsd-all-probes.stp' + fi +elif [[ $(rpm --eval '%{rhel}') -le 6 ]]; then + true +fi + +which stap | fgrep -q toolset && blacklist_subtest 'modules_out_of_tree.exp' + +rlJournalStart + rlPhaseStartSetup + TESTSUITERPM="$(rpm --queryformat='%{name}\n' -qf $(which stap) | head -1 | grep -o '.*systemtap')-testsuite" + rlLogInfo "$(rpm -q $TESTSUITERPM)" + TESTSUITEDIR="$(rpm -ql $TESTSUITERPM | grep -o '.*share/systemtap/testsuite/' | head -1)" + rlLogInfo "$TESTSUITEDIR" + + # For devtoolset, compat arch support was dropped for non-x86_64 arches. Ref: bz1493500 + if echo $TESTSUITEDIR | grep -q toolset && arch | egrep -q '^(ppc64|s390x)$'; then + sed -i '/^proc arch_compile_flags/,/^}/d' $TESTSUITEDIR/lib/compile_flags.exp + echo 'proc arch_compile_flags {} { return 1 }' >> $TESTSUITEDIR/lib/compile_flags.exp + fi + + # Need to suppress warnings so that task_dentry_path.exp can pass + # And --skip-badvars to let task_paths.exp pass + rlRun "sed -i 's/--rlimit-cpu=850/-w --skip-badvars \0/' $TESTSUITEDIR/lib/systemtap.exp" + + rlServiceStop firewalld + rlServiceStop iptables + rlServiceStop ip6tables + rlServiceStart avahi-daemon + rlRun "rpm -qa | grep ^kernel | grep -v `uname -r` | xargs rpm -e" 0-255 + rlRun "stap-prep" 0,127 + PKGMGR="yum --skip-broken --nogpgcheck" + rpm -q dnf && PKGMGR="dnf --setopt=strict=0 --nogpgcheck" + rlRun "$PKGMGR -y install --setopt=multilib_policy=all libstdc++ dejagnu elfutils-devel gettext libgcc glibc-devel gcc-c++ libstdc++-devel dyninst dyninst-devel" + rlRun "sysctl -w kernel.panic=1" + rlRun "sysctl -w kernel.panic_on_oops=1" + rlPhaseEnd + + rlPhaseStartTest + rlRun "cd $TESTSUITEDIR" + rlRun "make clean" + rlRun "dmesg > $DMESG1" + rlRun "make installcheck RUNTESTFLAGS=\"${RUNTESTFLAGS:-$SUBTESTS}\"" + rlRun "dmesg > $DMESG2" + rlLogInfo "$SUBTESTS" + rlDejaSum "systemtap.sum" + rlFileSubmit "systemtap.log" + rlFileSubmit "systemtap.sum" + rlPhaseEnd + + rlPhaseStart FAIL "Run selected -p4 tests" + for t in $P4TESTS; do + rlLogInfo "Trying to compile $t without prologue search ..." + ADDSWITCHES='' + stap $ADDSWITCHES -w -o /dev/null -p4 $t || ADDSWITCHES='-P' + rlRun "stap $ADDSWITCHES -w -p4 $t" + done + rlPhaseEnd + + rlPhaseStart FAIL "Check for BUG: in dmesg" + rlRun "diff $DMESG1 $DMESG2" 0-255 + rlRun "diff $DMESG1 $DMESG2 | grep 'BUG:'" 1 + rlPhaseEnd + + rlPhaseStart FAIL "Evaluate test results" + TEMPLOG=$(mktemp) + rlRun "cp systemtap.sum $TEMPLOG" + # BLACKLIST + if which stap | grep -q toolset; then + rlLogInfo "Ignore boot time probing subtest FAILures per bz1121363#c20 for devtoolset" + sed -i '/^FAIL: stap-service::boot probing - install script/d' $TEMPLOG + sed -i '/^FAIL: stap-service::boot probing - check script/d' $TEMPLOG + fi + # check for failures + rlRun "grep ^PASS $TEMPLOG" 0 "Assert a/some PASS" + rlRun "grep ^FAIL $TEMPLOG" 1 "Assert no FAIL" + rm -f $TEMPLOG + rlPhaseEnd + + rlPhaseStartCleanup + rlServiceRestore firewalld + rlServiceRestore iptables + rlServiceRestore ip6tables + rlServiceRestore avahi-daemon + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/semantic-error-nfs-proc-read_setup/main.fmf b/tests/Regression/semantic-error-nfs-proc-read_setup/main.fmf new file mode 100644 index 0000000..72489b4 --- /dev/null +++ b/tests/Regression/semantic-error-nfs-proc-read_setup/main.fmf @@ -0,0 +1,14 @@ +summary: semantic-error-nfs-proc-read_setup +description: semantic-error-nfs-proc-read_setup +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 5m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=884951 +extra-summary: /tools/systemtap/Regression/semantic-error-nfs-proc-read_setup +extra-task: /tools/systemtap/Regression/semantic-error-nfs-proc-read_setup diff --git a/tests/Regression/semantic-error-nfs-proc-read_setup/nfs.proc.read_setup.stp b/tests/Regression/semantic-error-nfs-proc-read_setup/nfs.proc.read_setup.stp new file mode 100644 index 0000000..c6974c7 --- /dev/null +++ b/tests/Regression/semantic-error-nfs-proc-read_setup/nfs.proc.read_setup.stp @@ -0,0 +1,5 @@ +probe nfs.proc.read_setup{ + println("nfs.proc.read_setup server_ip: ", server_ip); + println("nfs.proc.read_setup prot: ", prot); +} + diff --git a/tests/Regression/semantic-error-nfs-proc-read_setup/runtest.sh b/tests/Regression/semantic-error-nfs-proc-read_setup/runtest.sh new file mode 100755 index 0000000..d14e39b --- /dev/null +++ b/tests/Regression/semantic-error-nfs-proc-read_setup/runtest.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/semantic-error-nfs-proc-read_setup +# Description: semantic-error-nfs-proc-read_setup +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "uname -r" + rlRun "rpm -qa | grep ^kernel | sort" + rlRun "rpm -qa | grep systemtap | sort" + rlRun "which stap" + rlPhaseEnd + + rlPhaseStartTest + rlRun "stap -v -p 2 nfs.proc.read_setup.stp" + rlPhaseEnd + +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/semantic-errors-bz1062076/main.fmf b/tests/Regression/semantic-errors-bz1062076/main.fmf new file mode 100644 index 0000000..ca70df0 --- /dev/null +++ b/tests/Regression/semantic-errors-bz1062076/main.fmf @@ -0,0 +1,14 @@ +summary: semantic-errors-bz1062076 +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 30m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1062076 +extra-summary: /tools/systemtap/Regression/semantic-errors-bz1062076 +extra-task: /tools/systemtap/Regression/semantic-errors-bz1062076 diff --git a/tests/Regression/semantic-errors-bz1062076/runtest.sh b/tests/Regression/semantic-errors-bz1062076/runtest.sh new file mode 100755 index 0000000..3f53859 --- /dev/null +++ b/tests/Regression/semantic-errors-bz1062076/runtest.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/semantic-errors-bz1062076 +# Description: semantic-errors-bz1062076 +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartTest + rlLogInfo "Check if we might want to try out prologue search" + p="" + stap -vp4 sript.stp >& /dev/null || p="-P" + rlRun "stap $p -vp4 script.stp" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/semantic-errors-bz1062076/script.stp b/tests/Regression/semantic-errors-bz1062076/script.stp new file mode 100644 index 0000000..7527474 --- /dev/null +++ b/tests/Regression/semantic-errors-bz1062076/script.stp @@ -0,0 +1,3 @@ +probe nfsd.close? { printf("%s\n", filename) } probe never { exit() } +probe sunrpc.clnt.clone_client { print(progname) } +probe scsi.iodone { printf("%d, %d, %d, %d, %d, %d, %d, %d\n", host_no, channel, lun, dev_id, device_state, data_direction, req_addr, scsi_timer_pending ) } diff --git a/tests/Regression/semantic-errors-bz953776/main.fmf b/tests/Regression/semantic-errors-bz953776/main.fmf new file mode 100644 index 0000000..c95eaee --- /dev/null +++ b/tests/Regression/semantic-errors-bz953776/main.fmf @@ -0,0 +1,17 @@ +summary: semantic-errors-bz953776 +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +require: +recommend: + - systemtap + - perf + - gcc +duration: 60m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=953776 +extra-summary: /tools/systemtap/Regression/semantic-errors-bz953776 +extra-task: /tools/systemtap/Regression/semantic-errors-bz953776 diff --git a/tests/Regression/semantic-errors-bz953776/runtest.sh b/tests/Regression/semantic-errors-bz953776/runtest.sh new file mode 100755 index 0000000..28e9359 --- /dev/null +++ b/tests/Regression/semantic-errors-bz953776/runtest.sh @@ -0,0 +1,161 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/semantic-errors-bz953776 +# Description: semantic-errors-bz953776 +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +_rhelmajor=$(rpm --eval '%{rhel}') +_arch=$(arch) + +function perf_probe_failed () +{ + probe=$1 + perf probe -d $probe ||: + perf probe --add $probe + retval=$? + test $retval -eq 0 && \ + rlLogInfo "Running perf probe --add $probe PASSED" || \ + rlLogInfo "Running perf probe --add $probe FAILED" + perf probe -d $probe ||: + if test $retval -eq 0; then + return 1 + else + return 0 + fi +} + +function perf_found_none_of () +{ + ret=0 + for f in "$@"; do + perf_probe_failed $f || ret=1 + done + return $ret +} + +rlJournalStart + # CHECK FOR PERF ---------------------------------------------- + rlPhaseStart FAIL "CHECK FOR PERF" + rlRun "perf --version" + rlPhaseEnd + + rlPhaseStartSetup + rlRun "TMPDIR=$(mktemp -d)" + rlRun "pushd $TMPDIR" + + # prepare sigaltstack for case-5 + cat > sigaltstack.c < +#include +void handler(int sig) +{ + write(2, "stack overflow\n", 15); + _exit(1); +} +unsigned infinite_recursion(unsigned x) { + return infinite_recursion(x)+1; +} +int main() +{ + static char stack[SIGSTKSZ]; + stack_t ss = { + .ss_size = SIGSTKSZ, + .ss_sp = stack, + }; + struct sigaction sa = { + .sa_handler = handler, + .sa_flags = SA_ONSTACK + }; + sigaltstack(&ss, 0); + sigfillset(&sa.sa_mask); + sigaction(SIGSEGV, &sa, 0); + infinite_recursion(0); +} +EOF + rlRun "gcc -o sigaltstack sigaltstack.c" + rlPhaseEnd + + p="" + uname -m | grep -q ^ppc && p="-P" + p="$p -E 'probe timer.s(900){error(\"probe timeout after 15 minutes\")}'" + + export p + + rlPhaseStart FAIL 'case-1' + rlRun "stap $p -v -e 'probe syscall.close { println(fd); exit(); }'" + rlPhaseEnd + + # After fixing bz1657681, this constraint can be removed + if [[ $(rpm --eval %rhel) -le 7 ]]; then + if arch | grep -vq ppc; then + rlPhaseStart FAIL 'case-2' + # https://bugzilla.redhat.com/show_bug.cgi?id=1657681 + rlRun "stap $p -v -e 'probe socket.close { print(protocol); print(family); print(state); print(flags); print(type); exit() }'" + rlPhaseEnd + fi + fi + + ( + test $_rhelmajor -le 8 && exit + perf_found_none_of "sys_read" "__arm64_sys_read" "do_syscall_64" && exit + test $_rhelmajor -ge 9 && test $_arch = ppc64le -o $_arch = aarch64 && p="$p -p4" # no hits + rlPhaseStart FAIL 'case-3' + rlRun "stap $p -v -e 'probe kernel.function(\"sys_read\").return!, kernel.function(\"__arm64_sys_read\").return!, kernel.function(\"do_syscall_64\").return { println(probefunc()) exit()}'" + rlPhaseEnd + ) + + rlPhaseStart FAIL 'case-4' + rlRun "stap $p -v -e 'probe syscall.open, syscall.openat { if (\"open\" == execname()) println(argstr); exit() }'" + rlPhaseEnd + + rlPhaseStart FAIL 'case-5' + rlRun "stap $p -ve 'probe syscall.sigaltstack { println(name); exit() }' -c './sigaltstack || true'" + rlPhaseEnd + + # gcc 8.2.1->8.3.1 change related to systemtap debuginfo regression in rhel-8.1.0, kernel -84 -> -85 + # https://bugzilla.redhat.com/show_bug.cgi?id=1709831#c17 + # ( fgrep RESULT: /tmp/typescript | sort -u ) + rlPhaseStart FAIL 'case-6' + rlRun "stap $p -vp4 -e 'probe sunrpc.clnt.shutdown_client { println(servername) }'" + rlPhaseEnd + + rlPhaseStart FAIL 'case-7' + rlRun "stap $p -vp4 -e 'probe sunrpc.clnt.bind_new_program { println(servername) }'" + rlPhaseEnd + + rlPhaseStart FAIL 'case-8' + rlRun "stap $p -vp4 -e 'probe sunrpc.clnt.bind_new_program { println(servername, vers) }'" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/small-tests/main.fmf b/tests/Regression/small-tests/main.fmf new file mode 100644 index 0000000..caa5060 --- /dev/null +++ b/tests/Regression/small-tests/main.fmf @@ -0,0 +1,15 @@ +summary: Small tests +description: '' +contact: Martin Cermak +component: +- systemtap +test: ./runtest.sh +framework: beakerlib +recommend: +- systemtap +- systemtap-testsuite +- perf +duration: 10m +extra-summary: /tools/systemtap/Regression/small-tests +extra-task: /tools/systemtap/Regression/small-tests +tier: 1 diff --git a/tests/Regression/small-tests/runtest.sh b/tests/Regression/small-tests/runtest.sh new file mode 100755 index 0000000..3b89566 --- /dev/null +++ b/tests/Regression/small-tests/runtest.sh @@ -0,0 +1,222 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/small-tests +# Description: suns small tests +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS" +export DEBUGINFOD_TIMEOUT=300 + +_arch=$(arch) + +function perf_probe_failed () +{ + probe=$1 + perf probe -d $probe ||: + perf probe --add $probe + retval=$? + test $retval -eq 0 && \ + rlLogInfo "Running perf probe --add $probe PASSED" || \ + rlLogInfo "Running perf probe --add $probe FAILED" + perf probe -d $probe ||: + if test $retval -eq 0; then + return 1 + else + return 0 + fi +} + +function perf_found_none_of () +{ + ret=0 + for f in "$@"; do + perf_probe_failed $f || ret=1 + done + return $ret +} + +rlJournalStart + # Check the environment --------------------------------------- + rlPhaseStart WARN "Check the environment" + rlRun "rpm -qa | egrep '^(kernel|systemtap|perf)' | sort" + rlRun "uname -r" + rlRun "perf --version" + rlPhaseEnd + + # bz1162939 --------------------------------------------------- + ( + perf_probe_failed "vfs_read" && exit + rlPhaseStart FAIL "test 1 bz1162939" + # At this point a weird problem shows up: sometimes the first + # systemtap invocation fails for some reason, but subsequent + # invocations succeed. Can't reproduce this manually: + rlRun "stap -vvvp4 -e 'probe vfs.read{println(\"hit\")}'" 0,1 + sleep 30 + rlRun "stap -vvvp4 -e 'probe vfs.read{println(\"hit\")}'" 0,1 + sleep 30 + rlRun "stap -e 'probe vfs.read{println(\"hit\")}' -c 'head -1 /etc/hosts'" + rlPhaseEnd + ) + # bz1119335 --------------------------------------------------- + rlPhaseStart FAIL "test 2 bz1119335" + rlRun "man 8 staprun | grep 'STAP_FIPS_OVERRIDE'" + rlPhaseEnd + + # bz1153673 --------------------------------------------------- + rlPhaseStart FAIL "test 3 bz1153673" + _tested=0 + for _pkg in $( rpm -qa | grep systemtap-testsuite ); do + for _tc in $( rpm -ql $_pkg | grep 'alias_suffixes.stp$' ); do + stap -p4 $_tc && p="" || p="-P" + rlRun "stap $p -p4 $_tc" + _tested=1 + done + done + [[ $_tested -eq 0 ]] && rlFail "Not tested" + rlPhaseEnd + + # bz1160837 --------------------------------------------------- + ( + perf_probe_failed "sd_init_command" && exit + rlPhaseStart FAIL "test 4 bz1160837" + _tested=0 + _prologue_search='' + for _pkg in $( rpm -qa | grep systemtap-testsuite ); do + for _tc in $( rpm -ql $_pkg | grep 'iostat-scsi.stp$' ); do + test $_arch = ppc64le && _prologue_search='-P' + rlRun "stap -g $_prologue_search $_tc 1 -c 'sleep 1'" + _tested=1 + done + done + [[ $_tested -eq 0 ]] && rlFail "Not tested" + rlPhaseEnd + ) + + # bz1203808 --------------------------------------------------- + rlPhaseStart FAIL "test 5 bz1203808" + _tested=0 + for _pkg in $( rpm -qa | grep systemtap-testsuite ); do + for _tc in $( rpm -ql $_pkg | grep 'vfs-all-probes.stp$' ); do + stap -wp4 $_tc && p="" || p="-P" + rlRun "stap $p -w -p4 $_tc" + _tested=1 + done + done + [[ $_tested -eq 0 ]] && rlFail "Not tested" + rlPhaseEnd + + # bz1269062 --------------------------------------------------- + rlPhaseStart FAIL "test 6 bz1269062" + rlRun "stap -c sync --suppress-handler-errors -e 'probe ioscheduler.elv_add_request{println(elevator_name) exit()}'" + rlPhaseEnd + + # bz528792 --------------------------------------------------- + ( + # Not relevant on rhel-9 because of kernel commit cad6967ac10843a70842cd39c7b53412901dd21f that removes + # _do_fork() and replaces it with new kernel_clone() + perf_found_none_of "_do_fork" "do_fork" "sys_clone" && exit + + rlPhaseStart FAIL "test 7 bz528792" + if test $_arch = ppc64le; then + # https://bugzilla.redhat.com/show_bug.cgi?id=1652740#c4 - We can not reach any function parameters, namely $clone_flags + rlRun "stap -ve 'probe kernel.function(\"_do_fork\")!, kernel.function(\"do_fork\")!, kernel.function(\"sys_clone\") { println(pp()) exit() }' -c \"bash -c 'while sleep 1; do /bin/true; done'\"" + else + rlRun "stap -ve 'probe kernel.function(\"_do_fork\")!, kernel.function(\"do_fork\")!, kernel.function(\"sys_clone\") { printf(\"%x\n\",\$clone_flags) exit() }' -c \"bash -c 'while sleep 1; do /bin/true; done'\"" + fi + rlPhaseEnd + ) + + # bz1890702 --------------------------------------------------- + ( + perf_probe_failed "vfs_open" && exit + rlPhaseStart FAIL "test 8 bz1890702" + rlRun "stap -g --suppress-time-limits -e 'probe kernel.function(\"vfs_open\") { printf(\"%s(path: %s)\", ppfunc(), \$path\$) ; exit() }' -c 'cat /etc/hosts'" + rlPhaseEnd + ) + + # bz1904216 --------------------------------------------------- + rlPhaseStart FAIL "test 9 bz1904216" + rlRun "stap -p4 -DSTP_NO_OVERLOAD -t -c 'sleep 0.25' -e 'probe kernel.trace(\"bcache:bcache_btree_set_root\") { if (pid() == 0) printf(\"probe hit\n\"); }'" + rlPhaseEnd + + # bz1940804 --------------------------------------------------- + rlPhaseStart FAIL "test 10 bz1940804" + rlRun "stap -e 'probe process(\"/bin/bash\").function(\"main\") {println(pn()) }' -c '/bin/bash --help'" + rlPhaseEnd + + # bz1940945 --------------------------------------------------- + rlPhaseStart FAIL "test 11 bz1940945" + rlRun "stap -c sync --suppress-handler-errors -e 'probe ioscheduler.elv_add_request{println(elevator_name) exit()}'" + rlPhaseEnd + + # bz1940761 --------------------------------------------------- + rlPhaseStart FAIL "test 12 bz1940761" + rlRun "stap -v /usr/share/systemtap/examples/process/strace.stp -w -c \"echo hello world\"" + rlPhaseEnd + + # broken-tapset-print-ubacktrace ------------------------------ + rlPhaseStart FAIL "test 13 broken-tapset-print-ubacktrace" + rlRun "stap -p4 -e 'probe begin { print_ubacktrace() }'" + rlPhaseEnd + + # Protected from elision -------------------------------------- + rlPhaseStart FAIL "test 14 protected from elision" + rlRun "stap -v -e 'probe nfs.fop.fsync {} probe begin {print(\"Protected from elision\")}' -c true |\ + fgrep 'Protected from elision'" + rlPhaseEnd + + # bz544207 ---------------------------------------------------- + rlPhaseStart FAIL "test 15 bz544207" + extra_opts="" + stap -vp4 -e 'probe nfs.proc.write_setup{ println(how) }' || extra_opts="-P" + rlRun "stap $extra_opts -vp4 -e 'probe nfs.proc.write_setup{ println(how) }'" + rlPhaseEnd + + # bz544209 ---------------------------------------------------- + rlPhaseStart FAIL "test 16 bz544209" + rlRun "stap -vp2 -e 'probe sunrpc.clnt.create_client.return {}'" + rlPhaseEnd + + # bz592830 ---------------------------------------------------- + rlPhaseStart FAIL "test 17 bz592830" + rlRun "stap -vp2 -e 'probe signal.check_ignored.return {println(1)}'" + rlPhaseEnd + + # caller-does-not-work ---------------------------------------- + rlPhaseStart FAIL "test 18 caller-does-not-work" + rlRun "stap -ve 'probe kernel.function(\"vfs_read\") \ + { printf(\"%s\n\", caller()); exit() }' 2>&1 | tee strace.log" + rlPhaseEnd + + # missing-rpc-tracepoints ------------------------------------- + rlPhaseStart FAIL "test 19 missing-rpc-tracepoints" + rlRun "stap -L 'kernel.trace(\"rpc*\")'" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/stap-ERROR-Build-id-mismatch-with/main.fmf b/tests/Regression/stap-ERROR-Build-id-mismatch-with/main.fmf new file mode 100644 index 0000000..6744a8d --- /dev/null +++ b/tests/Regression/stap-ERROR-Build-id-mismatch-with/main.fmf @@ -0,0 +1,14 @@ +summary: Test for BZ#1566422 (stap ERROR Build-id mismatch with) +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1566422 +extra-summary: /tools/systemtap/Regression/stap-ERROR-Build-id-mismatch-with +extra-task: /tools/systemtap/Regression/stap-ERROR-Build-id-mismatch-with diff --git a/tests/Regression/stap-ERROR-Build-id-mismatch-with/runtest.sh b/tests/Regression/stap-ERROR-Build-id-mismatch-with/runtest.sh new file mode 100755 index 0000000..f026393 --- /dev/null +++ b/tests/Regression/stap-ERROR-Build-id-mismatch-with/runtest.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/stap-ERROR-Build-id-mismatch-with +# Description: Test for BZ#1566422 (stap ERROR Build-id mismatch with) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartTest + if arch | grep -q s390x; then + rlLogWarning "Test not relevant" + else + rlRun "sudo modprobe igb" + rlRun "stap -e 'probe module(\"igb\").function(\"igb_*_module\") { printf(\"%s: %s.\n\", ctime(gettimeofday_s()), ppfunc()); }' -c \"bash -c 'sudo rmmod igb; sudo modprobe igb'\"" + fi + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/stapio-possible-circular-locking-dependency/main.fmf b/tests/Regression/stapio-possible-circular-locking-dependency/main.fmf new file mode 100644 index 0000000..c1bafab --- /dev/null +++ b/tests/Regression/stapio-possible-circular-locking-dependency/main.fmf @@ -0,0 +1,15 @@ +summary: Test for BZ#1020207 (stapio possible circular locking dependency) +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +require: +recommend: + - systemtap +duration: 4h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1020207 +extra-summary: /tools/systemtap/Regression/stapio-possible-circular-locking-dependency +extra-task: /tools/systemtap/Regression/stapio-possible-circular-locking-dependency diff --git a/tests/Regression/stapio-possible-circular-locking-dependency/runtest.sh b/tests/Regression/stapio-possible-circular-locking-dependency/runtest.sh new file mode 100755 index 0000000..856197c --- /dev/null +++ b/tests/Regression/stapio-possible-circular-locking-dependency/runtest.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/stapio-possible-circular-locking-dependency +# Description: Test for BZ#1020207 (stapio possible circular locking dependency) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPDIR=\$(mktemp -d)" + rlRun "pushd $TMPDIR" + cat > test5.stap < reproduce.sh < /proc/sys/vm/drop_caches + stap test5.stap -c "sleep 2" + if dmesg 2>&1 | grep "possible circular locking dependency detected"; then + dmesg + exit 1 + fi +done +exit 0 +EOF + + rlRun "chmod +x reproduce.sh" + rlPhaseEnd + + rlPhaseStartTest + TO=180 # timeout seconds + # when timeout TO is hit, exitcode 124 is returned + rlRun "timeout $TO ./reproduce.sh" 0,124 + # if issue doesn't get reproduced within TO, the test will pass + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/suspicious-RCU-usage/main.fmf b/tests/Regression/suspicious-RCU-usage/main.fmf new file mode 100644 index 0000000..5e9c792 --- /dev/null +++ b/tests/Regression/suspicious-RCU-usage/main.fmf @@ -0,0 +1,14 @@ +summary: suspicious-RCU-usage +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1788662 +extra-summary: /tools/systemtap/Regression/suspicious-RCU-usage +extra-task: /tools/systemtap/Regression/suspicious-RCU-usage diff --git a/tests/Regression/suspicious-RCU-usage/runtest.sh b/tests/Regression/suspicious-RCU-usage/runtest.sh new file mode 100755 index 0000000..bd11b63 --- /dev/null +++ b/tests/Regression/suspicious-RCU-usage/runtest.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/suspicious-RCU-usage +# Description: suspicious-RCU-usage +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2020 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartTest + dmesg1=$(mktemp) + dmesg2=$(mktemp) + diff=$(mktemp) + dmesg > $dmesg1 + rlRun "stap -e 'probe kernel.trace(\"*\"){}' -t -u -v -c '/bin/true'" + sleep 10 + dmesg > $dmesg2 + rlRun "diff $dmesg1 $dmesg2 |& tee $diff" + # Reproduced on hpe-moonshot-02-c02.hpe1.lab.eng.bos.redhat.com + # using kernel-4.18.0-167.el8.aarch64+debug and systemtap-4.2-1.el8.aarch64. + rlRun "fgrep -i rcu $diff" 1 + rm $dmesg{1,2} $diff + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/syscall-get-arguments-returning-wrong-value/main.fmf b/tests/Regression/syscall-get-arguments-returning-wrong-value/main.fmf new file mode 100644 index 0000000..da42eb6 --- /dev/null +++ b/tests/Regression/syscall-get-arguments-returning-wrong-value/main.fmf @@ -0,0 +1,15 @@ +summary: Test for BZ#1004059 (syscall_get_arguments() returning wrong value) +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - perf +duration: 30m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1004059 +extra-summary: /tools/systemtap/Regression/syscall-get-arguments-returning-wrong-value +extra-task: /tools/systemtap/Regression/syscall-get-arguments-returning-wrong-value diff --git a/tests/Regression/syscall-get-arguments-returning-wrong-value/runtest.sh b/tests/Regression/syscall-get-arguments-returning-wrong-value/runtest.sh new file mode 100755 index 0000000..182d69c --- /dev/null +++ b/tests/Regression/syscall-get-arguments-returning-wrong-value/runtest.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/syscall-get-arguments-returning-wrong-value +# Description: Test for BZ#1004059 (syscall_get_arguments() returning wrong value) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + + +ASMLINKAGE=''; +uname -m | egrep 'i[36]86' && \ + ASMLINKAGE='asmlinkage();' + +SCRIPT=$( mktemp ) +cat > $SCRIPT <<-EOF +probe kernel.function("sys_open") { + $ASMLINKAGE + if (\$filename == pointer_arg(1)) { + exit(); + } else { + error("Possible manifestation of rhbz1004059."); + } +} +EOF + +function perf_probe_failed () +{ + probe=$1 + perf probe -d $probe ||: + perf probe --add $probe + retval=$? + test $retval -eq 0 && \ + rlLogInfo "Running perf probe --add $probe PASSED" || \ + rlLogInfo "Running perf probe --add $probe FAILED" + perf probe -d $probe ||: + if test $retval -eq 0; then + return 1 + else + return 0 + fi +} + +rlJournalStart + rlPhaseStartTest + ( + perf_probe_failed "sys_open" && exit + stap -p4 $SCRIPT >&/dev/null && p="" || p='-P' + rlRun "stap $p -v $SCRIPT -c 'cat /dev/null'" + ) + rm $SCRIPT + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/main.fmf b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/main.fmf new file mode 100644 index 0000000..97ec25b --- /dev/null +++ b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/main.fmf @@ -0,0 +1,14 @@ +summary: task-cwd-path-results-in-an-in-kernel-memory-leak +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1412691 +extra-summary: /tools/systemtap/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak +extra-task: /tools/systemtap/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak diff --git a/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/reproducer.stp b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/reproducer.stp new file mode 100644 index 0000000..ff15bbb --- /dev/null +++ b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/reproducer.stp @@ -0,0 +1,10 @@ +probe kprocess.exit +{ + path=fullpath_struct_path(task_cwd_path(task_current())) + printf("%s\n", path) +} + +#probe timer.s(240) +#{ +# exit() +#} diff --git a/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/runtest.sh b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/runtest.sh new file mode 100755 index 0000000..aa64f4e --- /dev/null +++ b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/runtest.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak +# Description: task-cwd-path-results-in-an-in-kernel-memory-leak +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartTest + EXTRA="" + arch | fgrep ppc64le && EXTRA='-P' + + # We rely on (and check for) units to be kB + rlRun "test \"$( awk '/KernelStack/ {print $3}' /proc/meminfo )\" == \"kB\"" + rlRun "STACK1=$(awk '/KernelStack/ {print $2}' /proc/meminfo)" + rlRun "stap $EXTRA -w reproducer.stp -c 'bash ./trigger.sh' -o /dev/null" + rlRun "STACK2=$(awk '/KernelStack/ {print $2}' /proc/meminfo)" + rlRun "test $((STACK2 - 1000)) -le $STACK1" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/trigger.sh b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/trigger.sh new file mode 100755 index 0000000..165bd9a --- /dev/null +++ b/tests/Regression/task-cwd-path-results-in-an-in-kernel-memory-leak/trigger.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +for i in `seq 1 2000`; do + ls / > /dev/null +done + + diff --git a/tests/Regression/task-exe-file-results-in-an-file-struct-leak/main.fmf b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/main.fmf new file mode 100644 index 0000000..547e173 --- /dev/null +++ b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/main.fmf @@ -0,0 +1,14 @@ +summary: task-exe-file-results-in-an-file-struct-leak +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 48h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1430861 +extra-summary: /tools/systemtap/Regression/task-exe-file-results-in-an-file-struct-leak +extra-task: /tools/systemtap/Regression/task-exe-file-results-in-an-file-struct-leak diff --git a/tests/Regression/task-exe-file-results-in-an-file-struct-leak/reproducer.stp b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/reproducer.stp new file mode 100644 index 0000000..2dd39bb --- /dev/null +++ b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/reproducer.stp @@ -0,0 +1,6 @@ +probe kprocess.exit +{ + t=task_current() + path=fullpath_struct_file(t, task_exe_file(t)) + printf("%s\n", path) +} diff --git a/tests/Regression/task-exe-file-results-in-an-file-struct-leak/reproducer2.stp b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/reproducer2.stp new file mode 100644 index 0000000..f26764a --- /dev/null +++ b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/reproducer2.stp @@ -0,0 +1,5 @@ +probe kprocess.exit +{ + path=fullpath_struct_path(task_cwd_path(task_current())) + printf("%s\n", path) +} diff --git a/tests/Regression/task-exe-file-results-in-an-file-struct-leak/runtest.sh b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/runtest.sh new file mode 100755 index 0000000..0c4e643 --- /dev/null +++ b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/runtest.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/task-exe-file-results-in-an-file-struct-leak +# Description: task-exe-file-results-in-an-file-struct-leak +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2017 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartTest + EXTRA='' + arch | fgrep ppc64le && EXTRA="-P" + rlRun "FILE_NR1=$(awk '{print $1}' /proc/sys/fs/file-nr)" + REPRODUCER=reproducer.stp + rlRun "stap -g -w $EXTRA --dump-functions | fgrep task_exe_file || REPRODUCER=reproducer2.stp" + rlRun "stap -w $EXTRA $REPRODUCER -c 'bash ./trigger.sh' -o /dev/null" + rlRun "FILE_NR2=$(awk '{print $1}' /proc/sys/fs/file-nr)" + rlRun "test $((FILE_NR2 - 1000)) -le $FILE_NR1" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/task-exe-file-results-in-an-file-struct-leak/trigger.sh b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/trigger.sh new file mode 100755 index 0000000..31ee2bb --- /dev/null +++ b/tests/Regression/task-exe-file-results-in-an-file-struct-leak/trigger.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +for i in `seq 1 100000`; do + /bin/true +done + + diff --git a/tests/Regression/testsuite-upstream-raw/check_BPF.sh b/tests/Regression/testsuite-upstream-raw/check_BPF.sh new file mode 100755 index 0000000..325b894 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/check_BPF.sh @@ -0,0 +1,158 @@ +#!/bin/bash + +# Show the testcase list on demand. +if [[ "$1" == "TCLIST" ]]; then + if [[ "$(arch)" == "s390x" ]]; then + # Save the s390x machine time (regardless the rhel major): + # Almost all the testcases are failing there, and those, that + # do not, are flaky. + echo -n "notest.exp" + else + echo -n "bpf-asm.exp bpf.exp" + fi + exit 0 +fi + +_LOG=systemtap.check +cp systemtap.sum $_LOG + +_cleanup() +{ + rm $_LOG +} +trap _cleanup EXIT + +set -xe + +EXPECTED_PASSES_TRESHOLD=-1 + +if test $(rpm --eval '0%{rhel}') -eq 8; then + # systemtap-4.0-7.el8, kernel-4.18.0-64.el8 + case `arch` in + x86_64) + EXPECTED_PASSES_TRESHOLD=55 + sed -i '/FAIL: bigmap1.stp/d' $_LOG || : + sed -i '/FAIL: cast_op_tracepoint.stp/d' $_LOG || : + sed -i '/FAIL: logging1.stp/d' $_LOG || : + sed -i '/FAIL: perf1.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_smash.stp/d' $_LOG || : + sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : + sed -i '/FAIL: string3.stp/d' $_LOG || : + sed -i '/FAIL: timer1.stp/d' $_LOG || : + sed -i '/FAIL: timer2.stp/d' $_LOG || : + sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : + sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : + ;; + aarch64) + EXPECTED_PASSES_TRESHOLD=58 + sed -i '/FAIL: bigmap1.stp/d' $_LOG || : + sed -i '/FAIL: logging1.stp/d' $_LOG || : + sed -i '/FAIL: perf1.stp/d' $_LOG || : + sed -i '/FAIL: perf2.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_smash.stp/d' $_LOG || : + sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : + sed -i '/FAIL: string3.stp/d' $_LOG || : + sed -i '/FAIL: timer2.stp/d' $_LOG || : + sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : + ;; + ppc64le) + EXPECTED_PASSES_TRESHOLD=53 + sed -i '/FAIL: array.stp/d' $_LOG || : + sed -i '/FAIL: array_preinit.stp/d' $_LOG || : + sed -i '/FAIL: context_vars1.stp/d' $_LOG || : + sed -i '/FAIL: context_vars2.stp/d' $_LOG || : + sed -i '/FAIL: context_vars2.stp/d' $_LOG || : + sed -i '/FAIL: context_vars3.stp/d' $_LOG || : + sed -i '/FAIL: globals2.stp/d' $_LOG || : + sed -i '/FAIL: globals3.stp/d' $_LOG || : + sed -i '/FAIL: kprobes.stp/d' $_LOG || : + sed -i '/FAIL: logging1.stp/d' $_LOG || : + sed -i '/FAIL: perf1.stp/d' $_LOG || : + sed -i '/FAIL: perf2.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : + sed -i '/FAIL: pr23875_smash.stp/d' $_LOG || : + sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : + sed -i '/FAIL: string3.stp/d' $_LOG || : + sed -i '/FAIL: timer2.stp/d' $_LOG || : + sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : + ;; + s390x) + # Many testcases fail for s390x, many of them are flaky + # Not worth testing at all at this stage at all probably. + echo "INFO: UNSUPPORTED RHEL7 ARCHITECTIRE ($(arch))" + exit 0 + ;; + *) + echo "ERROR: UNSUPPORTED RHEL8 ARCHITECTIRE" + exit 1 + ;; + esac +elif test $(rpm --eval '0%{rhel}') -eq 7; then + case `arch` in + x86_64) + # (rhel7) systemtap-3.3-3.el7.x86_64, kernel-3.10.0-993.el7.x86_64 + if test $(rpm -q --queryformat='%{version}\n' kernel | awk -F. '{print $1}') -eq 3; then + EXPECTED_PASSES_TRESHOLD=32 + sed -i '/FAIL: cast_op_tracepoint.stp/d' $_LOG || : + sed -i '/FAIL: perf2.stp/d' $_LOG || : + sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : + sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : + elif test $(rpm -q --queryformat='%{version}\n' kernel | awk -F. '{print $1}') -eq 4; then + # (rhel-alt-7) systemtap-3.3-3.el7.x86_64, kernel-4.14.0-115.el7a.x86_64 + echo "ERROR: known bug on rhel-alt ('map entry 0: Function not implemented')" + echo "<@fche> # CONFIG_BPF_SYSCALL is not set" + exit 0 + else + echo "ERROR: UNSUPPORTED RHEL7 KERNEL VERSION" + exit 1 + fi + ;; + *) + echo "INFO: UNSUPPORTED RHEL7 ARCHITECTIRE ($(arch))" + exit 0 + ;; + esac +elif test $(rpm --eval '0%{fedora}') -eq 29; then + case `arch` in + x86_64) + EXPECTED_PASSES_TRESHOLD=33 + sed -i '/FAIL: array.stp/d' $_LOG || : + sed -i '/FAIL: bigmap1.stp/d' $_LOG || : + sed -i '/FAIL: cast_op_tracepoint.stp/d' $_LOG || : + sed -i '/FAIL: no_end.stp/d' $_LOG || : + sed -i '/FAIL: printf.stp/d' $_LOG || : + sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : + sed -i '/FAIL: string1.stp/d' $_LOG || : + sed -i '/FAIL: timer2.stp/d' $_LOG || : + sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : + ;; + *) + # No test results for other arches yet + true; + ;; + esac +else + echo "ERROR: UNSUPPORTED RHELMAJOR" + exit 1 +fi + +true _v_v_v_v_v_v_v_v_v_v_v_ UNEXPECTED FAILURES: _v_v_v_v_v_v_v_v_v_v_v_v_v_v_ +fgrep 'FAIL: ' $_LOG || : +true -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^- + + +EXPECTED_PASSES=$(grep -a '^PASS: ' $_LOG | wc -l) +UNEXPECTED_FAILURES=$(grep -a '^FAIL: ' $_LOG | wc -l) + +test ${EXPECTED_PASSES_TRESHOLD} -gt 1 +test 0${EXPECTED_PASSES} -ge 0${EXPECTED_PASSES_TRESHOLD} +test 0${UNEXPECTED_FAILURES} -eq 0 + +rm $_LOG + +set +xe + + diff --git a/tests/Regression/testsuite-upstream-raw/check_DEFAULT.sh b/tests/Regression/testsuite-upstream-raw/check_DEFAULT.sh new file mode 100755 index 0000000..ed0eea8 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/check_DEFAULT.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +if [[ "$1" == "TCLIST" ]]; then + # Empty list means to run all the testcases: + exit 0 +fi + +set -xe + +# It turns out that dg-extract-results.sh relies on the logfiles +# summary (# of expected passes, # of unexpected failures, etc.) and +# counts the summary values based on that. This is is okay for the +# normal dg-extract-results.sh use-case where it combines together +# correct (per single testcase) logs coming from parallel GDB testcase +# runs, where each of the input logfiles has such summary. +# +# But in our case we are combining incomplete log snippets coming from +# various terminated/incomplete/partial testsuite runs (kernel +# stall/crash, watchdog termination etc), where the log snippets do not +# have that summary (with an exception of the very last one). The +# result is that only the last of the log snippets gets properly +# counted, and the results from the other log snippets are ignored. +# +# rlRun "EXPECTED_PASSES=$(awk '/^# of expected passes/ {print $NF}' systemtap.sum)" +# rlRun "UNEXPECTED_FAILURES=$(awk '/^# of unexpected failures/ {print $NF}' systemtap.sum)" +# +# So we really need to count the PASSes and FAILs on our own: +# + +EXPECTED_PASSES=$(grep -a '^PASS: ' systemtap.sum | wc -l) +UNEXPECTED_FAILURES=$(grep -a '^FAIL: ' systemtap.sum | wc -l) + +# +# For this rough check, ignoring other states such as KFAIL and others +# should be good enough. + +case `arch` in + x86_64) + EXPECTED_PASSES_TRESHOLD=9000 + UNEXPECTED_FAILURES_TRESHOLD=800 + ;; + ppc64*) + EXPECTED_PASSES_TRESHOLD=8000 + UNEXPECTED_FAILURES_TRESHOLD=750 + ;; + *) + EXPECTED_PASSES_TRESHOLD=8000 + UNEXPECTED_FAILURES_TRESHOLD=500 + ;; +esac + +test 0${EXPECTED_PASSES} -ge 0${EXPECTED_PASSES_TRESHOLD} +test 0${UNEXPECTED_FAILURES} -le 0${UNEXPECTED_FAILURES_TRESHOLD} + +set +xe diff --git a/tests/Regression/testsuite-upstream-raw/dg-extract-results.sh b/tests/Regression/testsuite-upstream-raw/dg-extract-results.sh new file mode 100755 index 0000000..ffea0a3 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/dg-extract-results.sh @@ -0,0 +1,453 @@ +#! /bin/sh + +# For a specified tool and optional list of test variants, extract +# test results from one or more test summary (.sum) files and combine +# the results into a new test summary file, sent to the standard output. +# The resulting file can be used with test result comparison scripts for +# results from tests that were run in parallel. See usage() below. + +# Copyright (C) 2008-2016 Free Software Foundation, Inc. +# Contributed by Janis Johnson +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GCC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +PROGNAME=dg-extract-results.sh + +# Try to use the python version if possible, since it tends to be faster. +PYTHON_VER=`echo "$0" | sed 's/sh$/py/'` +if test "$PYTHON_VER" != "$0" && + test -f "$PYTHON_VER" && + python -c 'import sys; sys.exit (0 if sys.version_info >= (2, 6) else 1)' \ + > /dev/null 2> /dev/null; then + exec python $PYTHON_VER "$@" +fi + +usage() { + cat <&2 +Usage: $PROGNAME [-t tool] [-l variant-list] [-L] sum-file ... + + tool The tool (e.g. g++, libffi) for which to create a + new test summary file. If not specified then all + specified sum files must be for the same tool. + variant-list One or more test variant names. If the list is + not specified then one is constructed from all + variants in the files for . + sum-file A test summary file with the format of those + created by runtest from DejaGnu. + If -L is used, merge *.log files instead of *.sum. In this + mode the exact order of lines may not be preserved, just different + Running *.exp chunks should be in correct order. +EOF +} + +# Write a message to the standard error. + +msg() { + echo "$@" >&2 +} + +# Parse the command-line options. + +VARIANTS="" +TOOL="" +MODE="sum" + +while getopts "l:t:L" ARG; do + case $ARG in + l) VARIANTS="${VARIANTS} ${OPTARG}";; + t) test -z "$TOOL" || (msg "${PROGNAME}: only one tool can be specified"; exit 1); + TOOL="${OPTARG}";; + L) MODE="log";; + \?) usage; exit 0;; + esac +done +shift `expr ${OPTIND} - 1` + +if test $# -lt 1 ; then + usage + exit 1 +fi + +TMPDIR=${TMPDIR-/tmp} +SUM_FILES="$@" +FIRST_SUM=$1 +TMP= +trap 'EXIT_STATUS=$?; rm -rf $TMP && exit $EXIT_STATUS' 0 +# Create a (secure) tmp directory for tmp files. +{ + TMP=`(umask 077 && mktemp -d -q "${TMPDIR}/dg-combine-results-$$-XXXXXX") 2>/dev/null` && + test -n "$TMP" && test -d "$TMP" +} || +{ + TMP=${TMPDIR}/dg-combine-results-$$-$RANDOM + (umask 077 && mkdir $TMP) +} || +{ + msg "${PROGNAME}: cannot create a temporary directory" + { (exit 1); exit 1; } +} + +# Find a good awk. + +if test -z "$AWK" ; then + for AWK in gawk nawk awk + do + if type $AWK 2>&1 | grep 'not found' > /dev/null 2>&1 ; then + : + else + break + fi + done +fi + +# Verify that the specified summary files exist. + +ERROR=0 +for FILE in $SUM_FILES +do + if ! test -f $FILE ; then + msg "${PROGNAME}: file $FILE does not exist." + ERROR=1 + fi +done +test $ERROR -eq 0 || exit 1 + +# Test if grep supports the '--text' option + +GREP=grep + +if echo -e '\x00foo\x00' | $GREP --text foo > /dev/null 2>&1 ; then + GREP="grep --text" +else + # Our grep does not recognize the '--text' option. We have to + # treat our files in order to remove any non-printable character. + for file in $SUM_FILES ; do + mv $file ${file}.orig + cat -v ${file}.orig > $file + done +fi + +if [ -z "$TOOL" ]; then + # If no tool was specified, all specified summary files must be for + # the same tool. + + CNT=`$GREP '=== .* tests ===' $SUM_FILES | $AWK '{ print $3 }' | sort -u | wc -l` + if [ $CNT -eq 1 ]; then + TOOL=`$GREP '=== .* tests ===' $FIRST_SUM | $AWK '{ print $2 }'` + else + msg "${PROGNAME}: sum files are for multiple tools, specify a tool" + msg "" + usage + exit 1 + fi +else + # Ignore the specified summary files that are not for this tool. This + # should keep the relevant files in the same order. + + SUM_FILES=`$GREP -l "=== $TOOL" $SUM_FILES` + if test -z "$SUM_FILES" ; then + msg "${PROGNAME}: none of the specified files are results for $TOOL" + exit 1 + fi +fi + +if [ "$TOOL" = acats ]; then + # Acats *.sum or *.log files aren't dejagnu generated, and they have + # somewhat different format. + ACATS_AWK=${TMP}/acats.awk + cat < $ACATS_AWK +BEGIN { + print_prologue=1; curfile=""; insummary=0 + passcnt=0; failcnt=0; unsupcnt=0; failures="" +} +/^[ \t]*=== acats configuration ===/ { + insummary=0 + if (print_prologue) print + next +} +/^[ \t]*=== acats tests ===/ { + if (print_prologue) print + print_prologue=0 + next +} +/^Running chapter / { + if (curfile) close (curfile) + curfile="${TMP}/chapter-"\$3 + print >> curfile + next +} +/^[ \t]*=== acats Summary ===/ { + if (curfile) close (curfile) + curfile="" + insummary=1 + next +} +/^# of expected passes/ { if (insummary == 1) passcnt += \$5; next; } +/^# of unexpected failures/ { if (insummary == 1) failcnt += \$5; next; } +/^# of unsupported tests/ { if (insummary == 1) unsupcnt += \$5; next; } +/^\*\*\* FAILURES: / { + if (insummary == 1) { + if (failures) sub(/^\*\*\* FAILURES:/,"") + failures=failures""\$0 + } +} +{ + if (print_prologue) { print; next } + if (curfile) print >> curfile +} +END { + system ("cat ${TMP}/chapter-*") + print " === acats Summary ===" + print "# of expected passes " passcnt + print "# of unexpected failures " failcnt + if (unsupcnt) print "# of unsupported tests " unsupcnt + if (failures) print failures +} +EOF + + rm -f ${TMP}/chapter-* + $AWK -f $ACATS_AWK $SUM_FILES + exit 0 +fi + +# If no variants were specified, find all variants in the remaining +# summary files. Otherwise, ignore specified variants that aren't in +# any of those summary files. + +if test -z "$VARIANTS" ; then + VAR_AWK=${TMP}/variants.awk + cat < $VAR_AWK +/^Schedule of variations:/ { in_vars=1; next } +/^$/ { in_vars=0 } +/^Running target/ { exit } +{ if (in_vars==1) print \$1; else next } +EOF + + touch ${TMP}/varlist + for FILE in $SUM_FILES; do + $AWK -f $VAR_AWK $FILE >> ${TMP}/varlist + done + VARIANTS="`sort -u ${TMP}/varlist`" +else + VARS="$VARIANTS" + VARIANTS="" + for VAR in $VARS + do + $GREP "Running target $VAR" $SUM_FILES > /dev/null && VARIANTS="$VARIANTS $VAR" + done +fi + +# Find out if we have more than one variant, or any at all. + +VARIANT_COUNT=0 +for VAR in $VARIANTS +do + VARIANT_COUNT=`expr $VARIANT_COUNT + 1` +done + +if test $VARIANT_COUNT -eq 0 ; then + msg "${PROGNAME}: no file for $TOOL has results for the specified variants" + exit 1 +fi + +cat $SUM_FILES \ + | $AWK '/^Running/ { if ($2 != "target" && $3 == "...") print "EXPFILE: "$2 } ' \ + | sort -u > ${TMP}/expfiles + +# Write the begining of the combined summary file. + +head -n 2 $FIRST_SUM +echo +echo " === $TOOL tests ===" +echo +echo "Schedule of variations:" +for VAR in $VARIANTS +do + echo " $VAR" +done +echo + +# For each test variant for the tool, copy test reports from each of the +# summary files. Set up two awk scripts from within the loop to +# initialize VAR and TOOL with the script, rather than assuming that the +# available version of awk can pass variables from the command line. + +for VAR in $VARIANTS +do + GUTS_AWK=${TMP}/guts.awk + cat << EOF > $GUTS_AWK +BEGIN { + variant="$VAR" + firstvar=1 + expfileno=1 + cnt=0 + print_using=0 + need_close=0 +} +/^EXPFILE: / { + expfiles[expfileno] = \$2 + expfilesr[\$2] = expfileno + expfileno = expfileno + 1 +} +/^Running target / { + curvar = \$3 + if (variant == curvar && firstvar == 1) { print; print_using=1; firstvar = 0 } + next +} +/^Using / { + if (variant == curvar && print_using) { print; next } +} +/^Running .*\\.exp \\.\\.\\./ { + print_using=0 + if (variant == curvar) { + if (need_close) close(curfile) + curfile="${TMP}/list"expfilesr[\$2] + expfileseen[\$2]=expfileseen[\$2] + 1 + need_close=0 + testname="00" + next + } +} +/^\t\t=== .* ===$/ { curvar = ""; next } +/^(PASS|XPASS|FAIL|XFAIL|UNRESOLVED|WARNING|ERROR|UNSUPPORTED|UNTESTED|KFAIL):/ { + testname=\$2 + # Ugly hack for gfortran.dg/dg.exp + if ("$TOOL" == "gfortran" && testname ~ /^gfortran.dg\/g77\//) + testname="h"testname +} +/^$/ { if ("$MODE" == "sum") next } +{ if (variant == curvar && curfile) { + if ("$MODE" == "sum") { + printf "%s %08d|", testname, cnt >> curfile + cnt = cnt + 1 + } + filewritten[curfile]=1 + need_close=1 + print >> curfile + } else + next +} +END { + n=1 + while (n < expfileno) { + if (expfileseen[expfiles[n]]) { + print "Running "expfiles[n]" ..." + if (filewritten["${TMP}/list"n]) { + if (expfileseen[expfiles[n]] == 1) + cmd="cat" + else + cmd="LC_ALL=C sort" + if ("$MODE" == "sum") + system (cmd" ${TMP}/list"n" | sed -n 's/^[^ ]* [^ |]*|//p'") + else + system ("cat ${TMP}/list"n) + } + } + n = n + 1 + } +} +EOF + + SUMS_AWK=${TMP}/sums.awk + rm -f $SUMS_AWK + cat << EOF > $SUMS_AWK +BEGIN { + variant="$VAR" + tool="$TOOL" + passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kpasscnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0; + curvar=""; insummary=0 +} +/^Running target / { curvar = \$3; next } +/^# of / { if (variant == curvar) insummary = 1 } +/^# of expected passes/ { if (insummary == 1) passcnt += \$5; next; } +/^# of unexpected successes/ { if (insummary == 1) xpasscnt += \$5; next; } +/^# of unexpected failures/ { if (insummary == 1) failcnt += \$5; next; } +/^# of expected failures/ { if (insummary == 1) xfailcnt += \$5; next; } +/^# of unknown successes/ { if (insummary == 1) kpasscnt += \$5; next; } +/^# of known failures/ { if (insummary == 1) kfailcnt += \$5; next; } +/^# of untested testcases/ { if (insummary == 1) untstcnt += \$5; next; } +/^# of unresolved testcases/ { if (insummary == 1) unrescnt += \$5; next; } +/^# of unsupported tests/ { if (insummary == 1) unsupcnt += \$5; next; } +/^$/ { if (insummary == 1) + { insummary = 0; curvar = "" } + next + } +{ next } +END { + printf ("\t\t=== %s Summary for %s ===\n\n", tool, variant) + if (passcnt != 0) printf ("# of expected passes\t\t%d\n", passcnt) + if (failcnt != 0) printf ("# of unexpected failures\t%d\n", failcnt) + if (xpasscnt != 0) printf ("# of unexpected successes\t%d\n", xpasscnt) + if (xfailcnt != 0) printf ("# of expected failures\t\t%d\n", xfailcnt) + if (kpasscnt != 0) printf ("# of unknown successes\t\t%d\n", kpasscnt) + if (kfailcnt != 0) printf ("# of known failures\t\t%d\n", kfailcnt) + if (untstcnt != 0) printf ("# of untested testcases\t\t%d\n", untstcnt) + if (unrescnt != 0) printf ("# of unresolved testcases\t%d\n", unrescnt) + if (unsupcnt != 0) printf ("# of unsupported tests\t\t%d\n", unsupcnt) +} +EOF + + PVAR=`echo $VAR | sed 's,/,.,g'` + TMPFILE=${TMP}/var-$PVAR + rm -f $TMPFILE + rm -f ${TMP}/list* + cat ${TMP}/expfiles $SUM_FILES | $AWK -f $GUTS_AWK + cat $SUM_FILES | $AWK -f $SUMS_AWK > $TMPFILE + # If there are multiple variants, output the counts for this one; + # otherwise there will just be the final counts at the end. + test $VARIANT_COUNT -eq 1 || cat $TMPFILE +done + +# Set up an awk script to get the combined summary counts for the tool. + +TOTAL_AWK=${TMP}/total.awk +cat << EOF > $TOTAL_AWK +BEGIN { + tool="$TOOL" + passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0 +} +/^# of expected passes/ { passcnt += \$5 } +/^# of unexpected failures/ { failcnt += \$5 } +/^# of unexpected successes/ { xpasscnt += \$5 } +/^# of expected failures/ { xfailcnt += \$5 } +/^# of unknown successes/ { kpasscnt += \$5 } +/^# of known failures/ { kfailcnt += \$5 } +/^# of untested testcases/ { untstcnt += \$5 } +/^# of unresolved testcases/ { unrescnt += \$5 } +/^# of unsupported tests/ { unsupcnt += \$5 } +END { + printf ("\n\t\t=== %s Summary ===\n\n", tool) + if (passcnt != 0) printf ("# of expected passes\t\t%d\n", passcnt) + if (failcnt != 0) printf ("# of unexpected failures\t%d\n", failcnt) + if (xpasscnt != 0) printf ("# of unexpected successes\t%d\n", xpasscnt) + if (xfailcnt != 0) printf ("# of expected failures\t\t%d\n", xfailcnt) + if (kpasscnt != 0) printf ("# of unknown successes\t\t%d\n", kpasscnt) + if (kfailcnt != 0) printf ("# of known failures\t\t%d\n", kfailcnt) + if (untstcnt != 0) printf ("# of untested testcases\t\t%d\n", untstcnt) + if (unrescnt != 0) printf ("# of unresolved testcases\t%d\n", unrescnt) + if (unsupcnt != 0) printf ("# of unsupported tests\t\t%d\n", unsupcnt) +} +EOF + +# Find the total summaries for the tool and add to the end of the output. +cat ${TMP}/var-* | $AWK -f $TOTAL_AWK + +# This is ugly, but if there's version output from the compiler under test +# at the end of the file, we want it. The other thing that might be there +# is the final summary counts. +tail -2 $FIRST_SUM | $GREP '^#' > /dev/null || tail -2 $FIRST_SUM + +exit 0 diff --git a/tests/Regression/testsuite-upstream-raw/helpers/createreport.sh b/tests/Regression/testsuite-upstream-raw/helpers/createreport.sh new file mode 100755 index 0000000..49180ac --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/helpers/createreport.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +TEMPDIR=$( mktemp -d ) +ORIGPWD=$( pwd ) + +cp /mnt/scratch/mcermak/testlogs/systemtap.upstream/*tar.xz $TEMPDIR/ + + +pushd $TEMPDIR || exit 1 + +# rename files so that identical commit hashes get identical (lowest possible) timestamp for sorting purposes +HASHES=$(ls systemtap*mcermak*tar.xz | awk -F\. '{print $4}' | sort -u) +for h in $HASHES; do + echo Processing hash $h + MINSTAMP4HASH=$( ls *$h* | tr '-' '.' | awk -F\. '{print $9}' | sort -n | grep '[0-9]\+' | head -n 1 ) + echo Min stamp for hash is: $MINSTAMP4HASH + PKG4HASH=$( ls *$h* ) + for p in $PKG4HASH; do + echo Processing pkg $p + PKGSTAMP=$( echo $p | tr '-' '.' | awk -F\. '{print $9}' ) + rename 'systemtap' "$MINSTAMP4HASH" $p + done +done + +# extract systemtap.sum files and rename them +for f in $( ls *tar.xz ); do + tar xJf $f systemtap.sum + mv systemtap.sum $f.sum + rename 'tar.xz.sum' 'log' $f.sum +done + +sh $ORIGPWD/report-helper.sh | tee wiki.out + +sed -i 's/UNKNOWN/?/g' wiki.out +sed -i 's/UNTESTED/-/g' wiki.out +sed -i 's/PASS/P/g' wiki.out +sed -i 's/FAIL/F/g' wiki.out +sed -i 's/ERROR/E/g' wiki.out + + +echo uploading logs to scratch... +OUT=/mnt/scratch/mcermak/testlogs/out +rm -rf $OUT && mkdir -p $OUT && chmod a+rwx $OUT && cp -v *tar.xz $OUT/ + +echo uploading to wiki... +cat wiki.out | $ORIGPWD/wikiup 'mcermak/systemtap.upstream' + +popd # $TEMPDIR +rm -rf $TEMPDIR diff --git a/tests/Regression/testsuite-upstream-raw/helpers/report-helper.sh b/tests/Regression/testsuite-upstream-raw/helpers/report-helper.sh new file mode 100755 index 0000000..1297045 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/helpers/report-helper.sh @@ -0,0 +1,130 @@ +#!/bin/bash + +HASHES=$( ls | awk -F\. '{print $4}' | sort -u ) +ARCHES=$( ls *log | awk -F- '{print $(NF-1) }' | awk -F. '{print $NF}' | sort -u ) + +declare -A MAXTESTS + +for p in $HASHES; do + MAXTESTS[$p]=0 + for a in $ARCHES; do + c=$( ls *log | grep $p | grep $a | wc -l ) + test $c -gt ${MAXTESTS[$p]} && MAXTESTS[$p]=$c + done +done + +TESTCASES=$( cat *log | awk '/^Running\ \.\/systemtap/ {print $2}' | sort -u ) + +TEMPFILE=$( mktemp ) + +function getCaseResults() { + casename=$1 + logfile=$2 + casename=$( echo $casename | tr "/" "." ) + cmd="cat $logfile | sed -e '/$casename/,/^Running/ !d'" + eval "$cmd" | head -n -1 +} + +function getWorstResult() { + results="$1" + retval='UNKNOWN' + echo "$results" | grep -q '^PASS' && retval='PASS' + echo "$results" | grep -q '^KPASS' && retval='KPASS' + echo "$results" | grep -q '^XPASS' && retval='XPASS' + echo "$results" | grep -q '^UNTESTED' && retval='UNTESTED' + echo "$results" | grep -q '^KFAIL' && retval='KFAIL' + echo "$results" | grep -q '^XFAIL' && retval='XFAIL' + echo "$results" | grep -q '^FAIL' && retval='FAIL' + echo "$results" | grep -q '^ERROR' && retval='ERROR' + echo $retval +} + +function getResult() { + casename=$1 + logfile=$2 + worstResult=$( getWorstResult "$( getCaseResults "$casename" "$logfile" )" ) + if test -s $logfile; then + loglink="http://nfs.englab.brq.redhat.com/scratch/mcermak/testlogs/out/$( echo $logfile | sed 's/log/tar\.xz/' )" + echo "[[$loglink|$worstResult]]" + else + echo $worstResult + fi +} + +function getLogs() { + package=$1 + arch=$2 + logcnt=$3 + availogcont=$( ls *log | grep $package | grep $arch | wc -l ) + remainlogcnt=$(( $logcnt - $availogcont )) + logs=$( ls *log | grep $package | grep $arch ) + for i in $( seq 1 $remainlogcnt ); do + logs="$logs $TEMPFILE" + done + echo $logs +} + +function colorizeResult() { + result=$1 + if echo $result | egrep -q '(KFAIL|XFAIL)'; then + echo "<#a2eea2> $result" + elif echo $result | egrep -q '(FAIL|ERROR)'; then + echo "<#f30000> $result" + elif echo $result | egrep -q '(UNKNOWN)'; then + echo "<#ffffff> $result" + else + echo "<#a2eea2> $result" + fi +} + +function getResultSet() { + package=$1 + arch=$2 + testcase=$3 + #echo -n "|| $package ($arch) " + echo -n "|| '''$arch''' " + for logfile in $( getLogs "$package" "$arch" ${MAXTESTS[$package]} ); do + result=$( getResult "$testcase" "$logfile" ) + echo -n "||$( colorizeResult "$result" ) " + done +} + +function getBugsForTestcase() { + testcase=$1 + testcase=$( echo $testcase | sed 's/^\.\///' | tr "/" "." ) + cmd="awk '/$testcase/ {print \$2}' bugs.txt" + eval "$cmd" +} + +function getBugLinksForTestcase() { + bznos="$1" + if ! test -z "$bznos"; then + echo + for bzno in $bznos; do + echo -e "[[https://bugzilla.redhat.com/show_bug.cgi?id=$bzno|bz$bzno]]" + done + echo + fi +} + +echo -n "== " +first=1 +for package in $HASHES; do + test $first -eq 0 && echo -n "<-> " + echo -n "$package " + first=0 +done +echo " ==" + +for testcase in $TESTCASES; do + echo -e "\n=== $testcase ===\n" + getBugLinksForTestcase "$( getBugsForTestcase "$testcase" )" + for arch in $ARCHES; do + for __hash in $HASHES; do + getResultSet $__hash $arch $testcase + done + echo " ||" + done +done + + diff --git a/tests/Regression/testsuite-upstream-raw/helpers/wikiup b/tests/Regression/testsuite-upstream-raw/helpers/wikiup new file mode 100755 index 0000000..f703910 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/helpers/wikiup @@ -0,0 +1,22 @@ +#!/usr/bin/python + +import sys +import xmlrpclib + +wikilocation = sys.argv[1] +wikicontent = sys.stdin.read() + +if not wikilocation.startswith("mcermak/"): + print "wiki location must start with mcermak/" + sys.exit(1) + +user = 'xmlrpc2' +password = 'fo0m4nchU+' +url='http://wiki.test.redhat.com/' +wiki = xmlrpclib.ServerProxy(url + '?action=xmlrpc2', allow_none=False) +auth_token = wiki.getAuthToken(user, password) +mc = xmlrpclib.MultiCall(wiki) +mc.applyAuthToken(auth_token) +mc.putPage(wikilocation, wikicontent) +result = mc() + diff --git a/tests/Regression/testsuite-upstream-raw/internal-watchdog.sh b/tests/Regression/testsuite-upstream-raw/internal-watchdog.sh new file mode 100755 index 0000000..f977337 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/internal-watchdog.sh @@ -0,0 +1,21 @@ +#/bin/bash + +test -x +__TRESHOLD=$(( 240 * 60 )) +__SLEEP=$(( 15 * 60 )) +__LOG="$1" +test -z $__LOG && exit 1 +test +x + +echo "`date` internal watchdog $$ starting." >> $__LOG +while true; do + sleep $__SLEEP + __DELTA=$(( `date +'%s'` - `stat -c '%Y' $__LOG` )) + if [[ $__DELTA -gt $__TRESHOLD ]]; then + echo "`date` internal watchdog $$ rebooting due to inactivity." >> $__LOG + sync + sleep 1m + reboot -f + sleep 5m + fi +done diff --git a/tests/Regression/testsuite-upstream-raw/main.fmf b/tests/Regression/testsuite-upstream-raw/main.fmf new file mode 100644 index 0000000..883d060 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/main.fmf @@ -0,0 +1,50 @@ +summary: testsuite-upstream-raw +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +# test: /bin/true +framework: beakerlib +recommend: + - avahi-debuginfo + - avahi-devel + - boost-devel + - byteman + - coreutils + - coreutils-debuginfo + - crash-devel + - dejagnu + - '@development' + - '@development-tools' + - dyninst-devel + - elfutils-devel + - gcc-c++ + - gettext-devel + - git + - glibc-debuginfo + - glibc-devel + - libselinux-devel + - libstdc++-devel + - m4 + - nss-devel + - pkgconfig + - postgresql-debuginfo + - postgresql-server + - python + - python3-debuginfo + - python-debuginfo + - python-libs-debuginfo + - rpm-devel + - sqlite-devel + - systemtap + - systemtap-testsuite + - tcl + - xz + - zlib-devel + - sqlite + - systemtap-debuginfo + - kernel-headers +duration: 72h +extra-summary: /tools/systemtap/Regression/testsuite-upstream-raw +extra-task: /tools/systemtap/Regression/testsuite-upstream-raw diff --git a/tests/Regression/testsuite-upstream-raw/runtest.sh b/tests/Regression/testsuite-upstream-raw/runtest.sh new file mode 100755 index 0000000..6b9a1b0 --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/runtest.sh @@ -0,0 +1,282 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/testsuite-upstream-raw +# Description: testsuite-upstream-raw +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2014 Red Hat, Inc. +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +# What part of the testsuite should we run (and then check for errors)? +_WHAT=${_WHAT:-DEFAULT} + +export AVC_ERROR='+no_avc_check' +touch /tmp/disable-qe-abrt + +unset DEBUGINFOD_PROGRESS +if test $(rpm --eval "0%{rhel}") -ge 9; then + # Allow use of debuginfod + export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ + # export DEBUGINFOD_PROGRESS=1 +else + unset DEBUGINFOD_URLS +fi + +trap '' SIGHUP SIGINT SIGQUIT SIGABRT + +ORIGPWD=$( pwd ) + +PKGMGR="yum --skip-broken --nogpgcheck" +rpm -q dnf && PKGMGR="dnf --setopt=strict=0 --nogpgcheck" + +STARTDATE=$(date +%Y-%m-%d-%H-%M-%S) +STAPSRPM=$(rpm -qif `which stap` | awk '/Source RPM/ {print $NF}' | sort -u | sed 's/\.src\.rpm//') +SUITERPM=$(rpm --queryformat '%{name}\n' -qf `which stap` | grep -o '.*systemtap' | sort -u)-testsuite +SUITELOC=$(rpm -ql $SUITERPM | grep -o '.*systemtap\/testsuite/' | sort -u) + +test_primary_arch_only () +{ + echo "=== TESTING PRIMARY ARCH ONLY ===" + sed -i '/^proc arch_compile_flags/,/^}/d' $SUITELOC/lib/compile_flags.exp + echo 'proc arch_compile_flags {} { return 1 }' >> $SUITELOC/lib/compile_flags.exp +} + +# For devtoolset, compat arch support was dropped for non-x86_64 arches. Ref: bz1493500 +if echo $SUITELOC | grep -q toolset && arch | egrep -q '^(ppc64|s390x)$'; then + test_primary_arch_only +elif test $(rpm -E '0%{rhel}') -ge 8 -a "$(arch)" != "x86_64"; then + test_primary_arch_only +fi + +# Currently the Makefile overrides what was set in the env via +# http://pkgs.devel.redhat.com/cgit/rpms/devtoolset-7/commit/?h=devtoolset-7.1-rhel-7&id=e305f5912a13bd2ca04ac319afca50bfab6f4aea +# And actually if the base rhel dyninst is installed, the dts testsuite runs against it rather than agains +# the dts-stap - producing irrelevant test results. +# +# A real fix on the stap side might be: +# -LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap +# +LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap:$(DESTDIR)$(libdir)/dyninst +# in the Makefile.am etc, but let's work this around for now in a way that we simply use the +# LD_LIBRARY_PATH taken directly from the env: +if echo $SUITELOC | grep -q toolset; then + sed -i 's/^LD_LIBRARY_PATH/# LD_LIBRARY_PATH/' $SUITELOC/Makefile +fi + +rlJournalStart + rlPhaseStartSetup + rlLogInfo "SUITERPM=$SUITERPM" + rlLogInfo "SUITELOC=$SUITELOC" + rlRun "pushd $SUITELOC" + rlServiceStop firewalld + rlServiceStop iptables + rlServiceStop ip6tables + rlServiceStart avahi-daemon + rlRun "rpm -qa | grep ^kernel | grep -v `uname -r` | xargs rpm -e --nodeps" 0-255 + # if ! (uname -r | fgrep -q '.rt'); then + # rlRun "$ORIGPWD/stap-prep" 0,127 || \ + # rlRun "stap-prep" 0,127 + # fi + rlRun "sysctl -w kernel.panic=1" + rlRun "sysctl -w kernel.panic_on_oops=1" + rlRun "$PKGMGR -y install --setopt=multilib_policy=all libstdc++ dejagnu elfutils-devel gettext libgcc glibc-devel gcc-c++ libstdc++-devel dyninst dyninst-devel" + rlPhaseEnd + + + MYDMESGDIR=/root/mydmesg + mkdir -p $MYDMESGDIR + if strings $(which dmesg) | fgrep -q -- '-w'; then + rlPhaseStart FAIL "Run dmesg recorder." + MYTIMESTAMP=$(date +%s) + dmesg -wH > $MYDMESGDIR/dmesg$MYTIMESTAMP & + MYDMESGPID=$! + rlLogInfo "Dmesg recorder file: $MYDMESGDIR/dmesg$MYTIMESTAMP" + rlLogInfo "Dmesg PID: $MYDMESGPID" + rlPhaseEnd + fi + + rlPhaseStart FAIL "sanity check" + rlRun "stap -vve 'probe kernel.function(\"vfs_read\"){ log(\"hey!\"); exit() } probe timer.s(60){log(\"timeout\"); exit()}'" + rlRun "stap -vvl 'process(\"/usr/sbin/fdisk\").function(\"main\")'" 0-255 + rlPhaseEnd + + if ! test -f $SUITELOC/systemtap.log; then + rlPhaseStart WARN "Apply blacklist" + # === RHEL7 === + if rlIsRHEL 7; then + if arch | grep -q s390; then + true + # PR17270 + #rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp" + #rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp" + #rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp" + # PR17140 + #rlRun "rm -f systemtap.examples/profiling/functioncallcount.stp" + elif arch | grep -q ppc; then + true + # PR17270 + #rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp" + #rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp" + #rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp" + # PR17126 + #rlRun "rm -f systemtap.base/tracepoints.exp" + # BZ1153082 + #rlRun "rm -f systemtap.clone/main_quiesce.exp" + #elif rpm -q systemtap | grep -q '2.4-16.el7_0'; then + # BZ1145958 + #rlRun "rm -f systemtap.base/process_resume.exp" + fi + # === FEDORA === + elif grep -qi fedora /etc/redhat-release; then + # BZ1153082 + rlRun "rm -f systemtap.clone/main_quiesce.exp" + fi + + # Work around problem fixed in https://sourceware.org/git/gitweb.cgi?p=systemtap.git;a=commitdiff;h=a9b0aa4dbd1aa7a1c36eba8102e1445e8f2eb8b8 + rlRun "sed -i 's/exit\ 0/return/' $(fgrep -ril 'exit 0' $(find . -type f -name '*.exp')) ||:" + rlPhaseEnd + else + rlPhaseStart FAIL "Post-process anticipated reboot" + # Sometimes the testsuite crashes the kernel or causes stall. + # In case --ignore-panic is set, the box gets rebooted (bz1155644). + # This shouldn't happen. It'd be nice to report it as FAIL, but that + # appears to be too pedantic. We'll need this bell to ring when + # too many unexpected failures get reported by the upstream test driver. + # rlRun "false" + + # Remove testcases that have already been run + for tc in $( awk '/^Running.*exp\ \.\.\.$/ {print $2}' *systemtap.log ); do + echo $tc | grep -q 'systemtap/notest.exp' && continue + test -f $tc && rm -f $tc && rlLog "Removed $tc" + done + + #generate random hash + HASH=$(date | md5sum | cut -c 1-32 -) + + # save existing logs before creating new ones + rlRun "mv systemtap.log ${HASH}-systemtap.log" + rlRun "mv systemtap.sum ${HASH}-systemtap.sum" + + # clean up garbage incl. systemtap.log + rlRun "make clean" + rlPhaseEnd + fi + + rlPhaseStartTest + # Start internal watchdog if running in beaker + if test -n $JOBID; then + rlLogInfo "Starting internal watchdog ..." + $ORIGPWD/internal-watchdog.sh "$SUITELOC/systemtap.sum" & + __WATCHDOG_PID=$! + sleep 3 + if ps -p $__WATCHDOG_PID; then + rlLogInfo "Internal watchdog running (pid $__WATCHDOG_PID)." + else + rlFail "Problem starting the internal watchdog." + fi + fi + + # The _WHAT env var allows the test to only run selected subset of all + # the tests and perform specific checks on the resulting logs. + # + # Accepted values: BPF + + # run the testsuite (grab the list of testcases from the respective check* file) + TESTCASES=$(bash ${ORIGPWD}/check_${_WHAT}.sh TCLIST) + rlRun "make RUNTESTFLAGS='$TESTCASES' installcheck 2>&1" + + # Kill internal watchdog if running in beaker + if ! test -z $JOBID; then + rlLogInfo "Killing internal watchdog ..." + kill -s TERM $__WATCHDOG_PID + fi + rlPhaseEnd + + rlPhaseStart FAIL "Put all the log fragments together" + rlRun "$ORIGPWD/dg-extract-results.sh *systemtap.sum > big-systemtap.sum" + rlRun "$ORIGPWD/dg-extract-results.sh -L *systemtap.log > big-systemtap.log" + rlRun "mv --force big-systemtap.sum systemtap.sum" + rlRun "mv --force big-systemtap.log systemtap.log" + # remove the hash-prefixed fragments + # these are needed for the resume mode, but since we got to this point, + # we most likely processed all the testcases somehow, put all the pieces + # together and can start cleaning up and reporting + rlRun "rm -f *-systemtap.{log,sum}" + rlPhaseEnd + + rlPhaseStart FAIL "rlFileSubmit logs" + rlRun "xz --keep --force systemtap.log" + rlFileSubmit "systemtap.log.xz" + rlRun "xz --keep --force systemtap.sum" + rlFileSubmit "systemtap.sum.xz" + rlRun "rm systemtap.log.xz systemtap.sum.xz" + rlPhaseEnd + + if [[ "$_WHAT" == "DEFAULT" ]]; then + rlPhaseStart FAIL "save logs to /mnt/scratch" + MP=$( mktemp -d ) + # Refer to /tools/systemtap/Install/upstream-head + SD=rhpkg; rpm -q systemtap | grep -q mcermak && SD=upstream + rlRun "echo ${BEAKER}jobs/${JOBID} > job.txt" + rlRun "tar cf mydmesg.tar $MYDMESGDIR" + rlRun "xz mydmesg.tar" + rlRun "mount -o rw,nolock nfs.englab.brq.redhat.com:/scratch/mcermak $MP" + if test $(rpm --eval '0%{rhel}') -eq 8 && (! echo ${STAPSRPM} | grep '\.el8'); then + rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.el8.$(uname -m)-${STARTDATE}" + else + rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.$(uname -m)-${STARTDATE}" + fi + rlRun "mkdir -p $( dirname $LOGNAME )" + rlRun "tar cJf ${LOGNAME}.tar.xz systemtap.log systemtap.sum job.txt mydmesg.tar.xz" + + # Upload logs to bunsen instance on tofan if running in beaker + if ! test -z $JOBID; then + LOGFULLNAME="${LOGNAME}.tar.xz" + LOGBASENAME="$(basename $LOGFULLNAME)" + rlLogInfo "Uploading test log to bunsen..." + rlRun "cat $LOGFULLNAME | \ + curl -X POST -F project=systemtap-qe \ + -F tarballname=$LOGBASENAME \ + -F 'tar=@-' \ + http://tofan.yyz.redhat.com:8013/bunsen-upload.py" + fi + rlRun "umount -l $MP && sleep 3 && rm -rf $MP" + rlPhaseEnd + fi + + rlPhaseStart FAIL "Log checks ($_WHAT)" + rlRun "bash ${ORIGPWD}/check_${_WHAT}.sh" + rlPhaseEnd + + rlPhaseStartCleanup + rlServiceRestore firewalld + rlServiceRestore iptables + rlServiceRestore ip6tables + rlServiceRestore avahi-daemon + rlRun popd + kill -9 $MYDMESGPID ||: + rlPhaseEnd +rlJournalPrintText +rlJournalEnd + +rm -f /tmp/disable-qe-abrt diff --git a/tests/Regression/testsuite-upstream-raw/stap-prep b/tests/Regression/testsuite-upstream-raw/stap-prep new file mode 100755 index 0000000..89b7c3c --- /dev/null +++ b/tests/Regression/testsuite-upstream-raw/stap-prep @@ -0,0 +1,150 @@ +#! /bin/bash +LANG=C; export LANG +PATH=/usr/sbin:/sbin:/usr/bin:/bin:$PATH; export PATH + +check_error() { if test $1 != 0; then printf "\n$2\n"; exit $1; fi } + +prep_rpm_based() { +# uname -r can produce different kinds of output: +# 2.6.32-30.el6.x86_64 (no variant, but including ".arch") +# 2.6.18-194.3.1.el5debug ("variant", without dot, no arch) +# 2.6.33.4-95.fc13.i686.PAE (".arch.variant", two dots) +# 3.18.6-100.fc20.i686+PAE (".arch+variant", dot, plus) +if [ "$#" -lt 1 ]; then + UNAME=`uname -r` # determine the kernel running on the machine +else + UNAME=$1 #user passed in uname value +fi +UNAME=`echo $UNAME | sed "s/ //"` #strip out any whitespace +KERNEL="kernel" +for VARIANT in debug kdump PAE xen; do + # strip out ".variant" or else "+variant" or else "variant" at end. + TMP=`echo $UNAME | sed "s/[\.\+]\?$VARIANT\$//"` + if [ "$TMP" != "$UNAME" ]; then + UNAME=$TMP; KERNEL="kernel-$VARIANT" + fi +done +KERN_ARCH=`uname -m` +KERN_REV=`echo $UNAME | sed s/.$KERN_ARCH//` # strip arch from uname +if [ -x /usr/bin/dnf ]; then + DI="dnf debuginfo-install" + DI_DEPS="" + D="dnf" +else + DI="debuginfo-install" + DI_DEPS="yum-utils" + D="yum" +fi +CANDIDATES="$KERNEL-$KERN_REV.$KERN_ARCH \ + $KERNEL-devel-$KERN_REV.$KERN_ARCH \ + $DI_DEPS" + +# Can't simply work with /boot/vmlinuz-* below because of +# https://sourceware.org/bugzilla/show_bug.cgi?id=26599 +_debuginfod_file=$(rpm -ql kernel-core | fgrep $(uname -r) | grep '\.so$' | tail -1) +# Now let's assume following to come from outside env... +# export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ +# export DEBUGINFOD_PROGRESS=1 +debuginfod-find debuginfo $(rpm -ql kernel-core | fgrep $(uname -r) | grep '\.so$' | tail -1) || \ + CANDIDATES="$CANDIDATES $KERNEL-debuginfo-$KERN_REV.$KERN_ARCH" + +NEEDED=`rpm --qf "%{name}-%{version}-%{release}.%{arch}\n" \ + -q $CANDIDATES | grep "is not installed" | awk '{print $2}'` +if [ "$NEEDED" != "" ]; then + echo -e "Need to install the following packages:\n$NEEDED" + if [ `id -u` = "0" ]; then #attempt to install + $D install -y --enablerepo=\* $NEEDED + if expr "$NEEDED" : ".*debuginfo.*" >/dev/null; + then + $DI -y $KERNEL-$KERN_REV.$KERN_ARCH; + fi + rpm -q $NEEDED + rc=$? + check_error $rc "problem installing rpm(s) $NEEDED\nin case of file conflicts, try again after # $D erase $KERNEL-debuginfo" + fi +fi +} + +prep_deb_based() { +if [ $# -ne 0 ]; then + echo "Specifying kernel version is not yet support on deb based systems." 1>&2 + exit 1 +fi + +# 2.6.32-5-amd64 +# 2.6.32-37-generic +ABINAME="$(cut -d " " -f 3 /proc/version)" + +# 2.6.32 +BASEVERSION="$(echo "$ABINAME" | cut -d "-" -f 1)" +DEBIAN_FRONTEND=noninteractive # don't confirm or chat +export DEBIAN_FRONTEND + +case "$DISTRO" in + Debian) # 2.6.32-39 + if uname -v | grep -q Debian; then + VERSION="$(uname -v | cut -d " " -f 4)" + else + VERSION="$(cut -d " " -f 3 /proc/version)" + fi + ;; + Ubuntu) + # 2.6.32-37.81 + if [ -f /proc/version_signature ]; then + VERSION="$(cut -d " " -f 2 /proc/version_signature | cut -d "-" -f 1-2)" + else # 4.18 + VERSION="$(cut -d " " -f 3 /proc/version)" + fi + ;; +esac + +( + echo "make >= 0" + echo "linux-image-$ABINAME = $VERSION" + echo "linux-headers-$ABINAME = $VERSION" + echo "linux-image-$ABINAME-dbgsym = $VERSION" +) | while read package relation requiredversion; do + installedversion="$(dpkg-query -W "$package" 2> /dev/null | cut -f 2)" + if [ "$installedversion" = "" ]; then + availableversion="$(apt-cache show $package 2> /dev/null | grep ^Version: | cut -d " " -f 2)" + if [ "$availableversion" = "" -a "$(echo $package | grep dbgsym$)" ]; then + echo "You need package $package but it does not seem to be available" + if [ "$DISTRO" = "Ubuntu" ]; then + echo " Ubuntu -dbgsym packages are typically in a separate repository" + echo " Follow https://wiki.ubuntu.com/DebuggingProgramCrash to add this repository" + elif [ "$DISTRO" = "Debian" ]; then + echo " Debian -dbgsym packages are typically in a separate repository" + echo " Follow https://wiki.debian.org/AutomaticDebugPackages to add this repository" + fi + else + echo "Need to install $package" + if [ `id -u` = "0" ]; then #attempt to install + apt-get -y install $package + fi + fi + elif ! dpkg --compare-versions $installedversion $relation $requiredversion; then + echo "Package $package version $installedversion does not match version of currently running kernel: $requiredversion" + echo " Consider apt-get upgrade && reboot" + fi +done + +user="$(id --user --name)" +if [ "$user" != "root" ]; then + groups="$(id --groups --name)" + for i in stapusr stapdev; do + if [ "$(echo $groups | grep $i)" = "" ]; then + echo "Be root or adduser $user $i" + fi + done +fi +} + +DISTRO="$(lsb_release --id --short 2> /dev/null)" +case "$DISTRO" in +Debian|Ubuntu) + prep_deb_based "$@" + ;; +*) + prep_rpm_based "$@" + ;; +esac diff --git a/tests/Regression/utrace-taskfinder-misses-events/main.fmf b/tests/Regression/utrace-taskfinder-misses-events/main.fmf new file mode 100644 index 0000000..b5af125 --- /dev/null +++ b/tests/Regression/utrace-taskfinder-misses-events/main.fmf @@ -0,0 +1,16 @@ +summary: Test for BZ#876848 (utrace taskfinder misses events when main thread) +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap + - gcc-c++ + - kernel-debuginfo +duration: 15m +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=876848 +extra-summary: /tools/systemtap/Regression/utrace-taskfinder-misses-events +extra-task: /tools/systemtap/Regression/utrace-taskfinder-misses-events diff --git a/tests/Regression/utrace-taskfinder-misses-events/pthreadtestcase.cpp b/tests/Regression/utrace-taskfinder-misses-events/pthreadtestcase.cpp new file mode 100644 index 0000000..30a8215 --- /dev/null +++ b/tests/Regression/utrace-taskfinder-misses-events/pthreadtestcase.cpp @@ -0,0 +1,35 @@ +#include +#include +#include + +int square (int x) +{ + return (x * x); +} + +void *my_thread(void *arg) +{ + int x = 0; + int sqr; + + while (true) { + sqr = square(5); + sleep(1); + } + return NULL; +} + +int main() +{ + pthread_t thread_id; + if (pthread_create(&thread_id, NULL, my_thread, NULL)) { + fprintf(stderr, "Error creating thread\n"); + return 1; + } + if (pthread_join(thread_id, NULL)) { + fprintf(stderr, "Error joining thread\n"); + return 2; + } + return 0; +} + diff --git a/tests/Regression/utrace-taskfinder-misses-events/pthreadtestcase.stp b/tests/Regression/utrace-taskfinder-misses-events/pthreadtestcase.stp new file mode 100644 index 0000000..d6ab354 --- /dev/null +++ b/tests/Regression/utrace-taskfinder-misses-events/pthreadtestcase.stp @@ -0,0 +1,28 @@ +#! /usr/bin/env stap + +probe timer.sec(180) +{ + printf("EXITONTIMEOUT\n"); + exit() +} + +probe process("./pthreadtestcase").function("square") +{ + printf("USERSPACEFUNCTIONENTER\n") + printf("=> %s(%s)\n", probefunc(), $$parms) +} + +probe process("./pthreadtestcase").function("square").return +{ + printf("USERSPACEFUNCTIONLEAVE\n") + printf("<= %s\n", probefunc()) + exit() +} + +probe process("./pthreadtestcase").statement("*@pthreadtestcase.cpp:7") +{ + printf("USERSPACEREACHEDLINE\n") + #printf(" x=%d, sqr=%d\n\n", $x, $sqr) + printf(" x=%d\n\n", $x) +} + diff --git a/tests/Regression/utrace-taskfinder-misses-events/runtest.sh b/tests/Regression/utrace-taskfinder-misses-events/runtest.sh new file mode 100755 index 0000000..c20788c --- /dev/null +++ b/tests/Regression/utrace-taskfinder-misses-events/runtest.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/utrace-taskfinder-misses-events +# Description: Test for BZ#876848 (utrace taskfinder misses events when main thread) +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +# if this testcase caused kernel crash and reboot, don't try to rerun it +[[ $REBOOTCOUNT -gt 0 ]] && exit 1 + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPDIR=\$(mktemp -d)" + rlRun "cp pthreadtestcase.cpp pthreadtestcase.stp $TMPDIR" + rlRun "pushd $TMPDIR" + rlPhaseEnd + + rlPhaseStart FAIL "Systemtap sanity check" + rlRun "stap --version" + rlRun "stap -v -e 'probe kernel.function(\"vfs_read\"){ exit() }'" + rlPhaseEnd + + rlPhaseStart FAIL "Prepare pthreadtestcase, run it" + rlRun "g++ -g -o pthreadtestcase pthreadtestcase.cpp -lpthread" + killall -9 pthreadtestcase &> /dev/null + ./pthreadtestcase & + MYPID=$! + sleep 3 + rlRun "ps | grep '$MYPID.*pthreadtestcase$'" + rlPhaseEnd + + rlPhaseStartTest + rlRun "stap -v pthreadtestcase.stp 2>&1 | tee mylog.txt" + rlRun "grep EXITONTIMEOUT mylog.txt" 1 + for token in USERSPACEFUNCTIONENTER \ + USERSPACEREACHEDLINE \ + USERSPACEFUNCTIONLEAVE + do + rlRun "grep ^$token$ mylog.txt" 0 + done + rlPhaseEnd + + rlPhaseStart FAIL "Shut pthreadtestcase down" + # pthreadtestcase should still be running + # so killing it should certsinly succeed + rlRun "kill $MYPID" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalEnd diff --git a/tests/Regression/wrong-data-returned-by-nfs-commit-done/main.fmf b/tests/Regression/wrong-data-returned-by-nfs-commit-done/main.fmf new file mode 100644 index 0000000..c4d5b52 --- /dev/null +++ b/tests/Regression/wrong-data-returned-by-nfs-commit-done/main.fmf @@ -0,0 +1,14 @@ +summary: wrong-data-returned-by-nfs-commit-done +description: '' +contact: Martin Cermak +component: + - systemtap +test: ./runtest.sh +framework: beakerlib +recommend: + - systemtap +duration: 2h +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=920444 +extra-summary: /tools/systemtap/Regression/wrong-data-returned-by-nfs-commit-done +extra-task: /tools/systemtap/Regression/wrong-data-returned-by-nfs-commit-done diff --git a/tests/Regression/wrong-data-returned-by-nfs-commit-done/runtest.sh b/tests/Regression/wrong-data-returned-by-nfs-commit-done/runtest.sh new file mode 100755 index 0000000..105b8b7 --- /dev/null +++ b/tests/Regression/wrong-data-returned-by-nfs-commit-done/runtest.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Regression/wrong-data-returned-by-nfs-commit-done +# Description: wrong-data-returned-by-nfs-commit-done +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="systemtap" + +rlJournalStart + rlPhaseStartSetup + rlRun "rpm -qf $(which --skip-alias stap)" + rlRun "TMPDIR=$(mktemp -d)" + rlRun "cp -r testpro $TMPDIR" + rlRun "pushd $TMPDIR/testpro/" + rlPhaseEnd + + rlPhaseStart FAIL "Systemtap sanity check" + rlRun "stap --version" + rlRun "stap -v -e 'probe kernel.function(\"vfs_read\"){ exit() }'" + rlRun "uname -a" + rlPhaseEnd + + rlPhaseStart FAIL "Build testing binary, prepare nfs environment" + rlRun "make" + rlRun "rhelmajor=$(rpm --eval %{rhel})" + rlRun "chmod u+x test-for-nfs" + rlRun "./test-for-nfs RHEL${rhelmajor}" + rlPhaseEnd + + rlPhaseStartTest + if stap -p2 nfs.proc.commit_done.stp >&/dev/null; then + rlRun "stap --prologue-searching=never --poison-cache -vc './nfs.proc.commit_done' nfs.proc.commit_done.stp 2>&1 | tee testout.log" + else + rlRun "stap --prologue-searching=always --poison-cache -vc './nfs.proc.commit_done' nfs.proc.commit_done.stp 2>&1 | tee testout.log" + fi + rlRun "grep -qP 'nfs.proc.commit_done server_ip:\ \d+\.\d+\.\d+\.\d+' testout.log" + rlPhaseEnd + + rlPhaseStart WARN "Clean the nfs environment up" + rlRun "./test-for-nfs -c RHEL${rhelmajor}" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/Makefile b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/Makefile new file mode 100644 index 0000000..021de18 --- /dev/null +++ b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/Makefile @@ -0,0 +1,11 @@ +CFLAGS+= -Wall + +SRCS = $(wildcard *.c) +TARGETS = $(patsubst %.c,%,$(SRCS)) + +all: $(TARGETS) + +install: + +clean: + rm -f $(TARGETS) diff --git a/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/nfs.proc.commit_done.c b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/nfs.proc.commit_done.c new file mode 100644 index 0000000..0417d71 --- /dev/null +++ b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/nfs.proc.commit_done.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_DIR "/systemtap-sts-nfs-share-and-mount-tmpdir/sts_mount" + +static int create_and_write(char *file_name); +static int read_file(char *file_name); + +int main(int argc, char *argv[]) +{ + char tmp_path[1024]; + char tmp_file[1024]; + char new_file[1024]; + + strcpy(tmp_path, getenv("HOME")); + strcat(tmp_path, TEST_DIR); + strcat(tmp_path, "/sts_tmp"); + strcpy(tmp_file, tmp_path); + strcpy(new_file, tmp_path); + strcat(tmp_file, "/tmp.txt"); + strcat(new_file, "/tmp2.txt"); + + if (mkdir(tmp_path, 0777) == -1) { + fprintf(stderr, "Create tmp path failed! %d\n", errno); + return -1; + } + if (create_and_write(tmp_file)) + return -1; + + if (rename(tmp_file, new_file) == -1) { + fprintf(stderr, "Rename failed! %d\n", errno); + return -1; + } + read_file(new_file); + if (remove(new_file) == -1) { + fprintf(stderr, "Remove file failed! %d\n", errno); + return -1; + } + + remove(tmp_path); + + return 0; +} + +static int create_and_write(char *file_name) +{ + char buf[] = "abcdefg123"; + int i; + int fd; + + fd = open(file_name, O_RDWR | O_CREAT, 00777); + if (!fd) { + fprintf(stderr, "Create tmp file failed!\n"); + return -1; + } + + for (i = 0; i < 1024 * 1024; i++){ + if (write(fd, buf, 10) != 10) { + fprintf(stderr, "Write error!\n"); + return -1; + } + } + + close(fd); + return 0; +} + +static int read_file(char *file_name) +{ + char buf[1024]; + int fd; + + fd = open(file_name, O_RDONLY); + lseek(fd, 1024 * 10, SEEK_SET); + read(fd, buf, 1024); + close(fd); + return 0; +} diff --git a/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/nfs.proc.commit_done.stp b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/nfs.proc.commit_done.stp new file mode 100644 index 0000000..8de8be0 --- /dev/null +++ b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/nfs.proc.commit_done.stp @@ -0,0 +1,3 @@ +probe nfs.proc.commit_done{ + printf("nfs.proc.commit_done server_ip: %s\n", %( systemtap_v >= "4.3" %? server_ip %: ip_ntop(server_ip) %)); +} diff --git a/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/test-for-nfs b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/test-for-nfs new file mode 100755 index 0000000..156831d --- /dev/null +++ b/tests/Regression/wrong-data-returned-by-nfs-commit-done/testpro/test-for-nfs @@ -0,0 +1,111 @@ +#!/bin/bash + +export NFS_TMP="$HOME/systemtap-sts-nfs-share-and-mount-tmpdir" + +nfs_service() +{ + local ret + local status="$1" + local OS_VER="$2" + + if [[ "$OS_VER" != "RHEL9" && "$OS_VER" != "RHEL8" && "$OS_VER" != "RHEL7" && "$OS_VER" != "RHEL6" && "$OS_VER" != "RHEL5" ]]; then + echo "Error: $OS_VER not supported." + return 1 + fi + + case "$status" in + restart) + ps -ef | grep "nfsd" | grep -v grep > /dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "nfsd already running!!" + return 0 + fi + + if [[ "$2" == "RHEL7" || "$2" == "RHEL8" || "$2" == "RHEL9" ]]; then + /bin/systemctl restart nfs-server.service + ret=$? + else + /etc/init.d/nfs restart + ret=$? + fi + ;; + stop) + if [[ "$2" == "RHEL7" || "$2" == "RHEL8" || "$2" == "RHEL9" ]]; then + /bin/systemctl stop nfs-server.service + ret=$? + else + /etc/init.d/nfs stop + ret=$? + fi + ;; + *) + echo "Error: nfs_service [stop|restart]" + ret=1 + ;; + esac + + return $ret +} + +clean_nfs_env() +{ + umount "$NFS_TMP"/sts_mount + /usr/sbin/exportfs -u 127.0.0.1:"$NFS_TMP"/sts_share + rm -rf "$NFS_TMP" + nfs_service stop $1 + if [ $? -ne 0 ]; then + return 1 + else + echo "Info: The nfs env for test clean successfully." + return 0 + fi +} + +create_nfs_env() +{ + nfs_service restart $1 + if [ $? -ne 0 ]; then + return 1 + fi + + sleep 1 + + mkdir -p "$NFS_TMP"/sts_share + mkdir -p "$NFS_TMP"/sts_mount + + /usr/sbin/exportfs -i -o 'rw,async,no_root_squash' 127.0.0.1:"$NFS_TMP"/sts_share + mount -t nfs 127.0.0.1:"$NFS_TMP"/sts_share "$NFS_TMP"/sts_mount + + return 0 +} + +if [ $# -gt 2 ]; then + echo "Usage: test-for-nfs [-c] OS_VERSION" + exit 1 +fi + +case "$1" in +-c) + clean_nfs_env $2 + ret=$? + if [ $ret -ne 0 ]; then + echo "Error: cleaning the nfs env for test failed." + fi + ;; +*) + if [ ! -z "$1" ]; then + create_nfs_env $1 + ret=$? + if [ $ret -eq 0 ]; then + echo "Info: The nfs env for test create successfully." + else + echo "Error: creating the nfs env for test failed." + fi + else + echo "Usage: test-for-nfs [-c] OS_VERSION" + ret=1 + fi + ;; +esac + +exit $ret diff --git a/tests/Sanity/byteman-java-methods-probing/ThreadedExample.java b/tests/Sanity/byteman-java-methods-probing/ThreadedExample.java new file mode 100644 index 0000000..8aa0f83 --- /dev/null +++ b/tests/Sanity/byteman-java-methods-probing/ThreadedExample.java @@ -0,0 +1,60 @@ +package foo.bar; + +import java.lang.*; +import java.util.*; + +class ThreadedExample +{ + + public static void printMessage(int message) { + System.out.println("message: " + message); + } + + public static void printMessage(long message) { + System.out.println("message: " + message); + } + + public static void main(String[] args) { + + // sleep so that stap can start and byteman agent gets installed + try { + Thread.sleep(30000); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + + + try { + String[] inputs = new String[] {"int", "foo", "long"}; + for (String next : inputs) { + + final String arg = next; + final int i = 42; + final long j = 987234864; + Thread thread = new Thread(arg) { + public void run() { + if(arg.equals("int")) + printMessage(i); + else if(arg.equals("long")) + printMessage(j); + else + System.out.println("Neither of the types"); + } + }; + thread.start(); + try { + thread.join(); + } catch (Exception e){} + } + } catch (Exception e){} + + + // sleep so that stap can finish still while probed java program still runs + try { + Thread.sleep(80000); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } +} + diff --git a/tests/Sanity/byteman-java-methods-probing/ThreadedExample.stp b/tests/Sanity/byteman-java-methods-probing/ThreadedExample.stp new file mode 100644 index 0000000..2aaa08c --- /dev/null +++ b/tests/Sanity/byteman-java-methods-probing/ThreadedExample.stp @@ -0,0 +1,18 @@ +probe java("foo.bar.ThreadedExample").class("ThreadedExample").method("printMessage(int)") +{ + printf("Hit printMessage(int): %s\n", arg1) +} + +probe java("foo.bar.ThreadedExample").class("ThreadedExample").method("printMessage(long)") +{ + printf("Hit printMessage(long): %s\n", arg1) + exit() +} + +probe timer.ms(100000) +{ + error("Exit on timeout") + exit() +} + + diff --git a/tests/Sanity/byteman-java-methods-probing/main.fmf b/tests/Sanity/byteman-java-methods-probing/main.fmf new file mode 100644 index 0000000..607b883 --- /dev/null +++ b/tests/Sanity/byteman-java-methods-probing/main.fmf @@ -0,0 +1,12 @@ +summary: byteman-java-methods-probing +description: '' +contact: Martin Cermak +test: ./runtest.sh +framework: beakerlib +recommend: +- java-devel +- systemtap +- systemtap-runtime-java +duration: 15m +extra-summary: /tools/systemtap/Sanity/byteman-java-methods-probing +extra-task: /tools/systemtap/Sanity/byteman-java-methods-probing diff --git a/tests/Sanity/byteman-java-methods-probing/runtest.sh b/tests/Sanity/byteman-java-methods-probing/runtest.sh new file mode 100755 index 0000000..f60f287 --- /dev/null +++ b/tests/Sanity/byteman-java-methods-probing/runtest.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Sanity/byteman-java-methods-probing +# Description: byteman-java-methods-probing +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS" +export DEBUGINFOD_TIMEOUT=300 + +rlJournalStart + rlPhaseStartSetup + # At this point we simply rely on that the %triggerin scriptlet from + # systemtap-runtime-java did it's job well. There was a hack to force + # trigger it here, but commit respective to this comment removes it. + # https://bugzilla.redhat.com/show_bug.cgi?id=1732514#c11 + + rlRun "rpm -qa | fgrep -e systemtap-runtime-java -e byteman -e openjdk | sort" + + rlRun "stap-prep" + + for BINARY in java javac; do + rlRun "alternatives --display $BINARY | grep -v slave" + rlRun "$BINARY -version" + done + + rlRun "TMPDIR=$( mktemp -d )" + rlRun "mkdir -p $TMPDIR/foo/bar" + rlRun "cp ThreadedExample.java $TMPDIR/foo/bar/" + rlRun "cp ThreadedExample.stp $TMPDIR/" + rlRun "pushd $TMPDIR" + rlPhaseEnd + + rlPhaseStart FAIL 'Prepare bytecode class' + rlRun "javac foo/bar/ThreadedExample.java" + rlPhaseEnd + + rlPhaseStart FAIL 'Prepare the LKML' + rlRun "stap -p4 -m ThreadedExample ThreadedExample.stp" + rlPhaseEnd + + rlPhaseStart FAIL 'Check the Feature' + java foo.bar.ThreadedExample & + rlRun "jps -l | grep 'foo.bar.ThreadedExample'" + export STAPBM_VERBOSE=yes + # rlRun "stap --poison-cache -vv ThreadedExample.stp 2>&1 | tee testout.log" + # Speed the stap startup up by pre-compiling the module within separate + # phase 'Prepare the LKML' above. + rlRun "staprun -v -R ThreadedExample.ko 2>&1 | tee testout.log" + rlRun "grep -q 'Hit printMessage(int): 42' testout.log" + rlRun "grep -q 'Hit printMessage(long): 987234864' testout.log" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Sanity/kernel-modules/Makefile.template b/tests/Sanity/kernel-modules/Makefile.template new file mode 100644 index 0000000..a8bfffb --- /dev/null +++ b/tests/Sanity/kernel-modules/Makefile.template @@ -0,0 +1,3 @@ +obj-m := MODULENAME.o +module: + make -C /lib/modules/$(shell uname -r)/build KBUILD_EXTMOD=DIRECTORY SUBDIRS=DIRECTORY modules diff --git a/tests/Sanity/kernel-modules/main.fmf b/tests/Sanity/kernel-modules/main.fmf new file mode 100644 index 0000000..88e2d17 --- /dev/null +++ b/tests/Sanity/kernel-modules/main.fmf @@ -0,0 +1,17 @@ +summary: Tests systemtap working with kernel modules +description: '' +contact: Petr Muller +component: +- systemtap +test: ./runtest.sh +framework: beakerlib +recommend: +- systemtap +- kernel-devel +- bison +- flex +- openssl-devel +- elfutils-libelf-devel +duration: 10m +extra-summary: /tools/systemtap/Sanity/kernel-modules +extra-task: /tools/systemtap/Sanity/kernel-modules diff --git a/tests/Sanity/kernel-modules/module.c b/tests/Sanity/kernel-modules/module.c new file mode 100644 index 0000000..427ddbc --- /dev/null +++ b/tests/Sanity/kernel-modules/module.c @@ -0,0 +1,20 @@ +#include /* Needed by all modules */ +#include /* Needed for KERN_INFO */ + +int init_module(void) +{ + printk(KERN_INFO "Hello world 1.\n"); + return 0; +} + +int some_method(void){ + printk(KERN_INFO "Some method called\n"); + return 0; +} + +void cleanup_module(void) +{ + printk(KERN_INFO "Goodbye world 1.\n"); +} + +MODULE_LICENSE("GPL"); diff --git a/tests/Sanity/kernel-modules/runtest.sh b/tests/Sanity/kernel-modules/runtest.sh new file mode 100755 index 0000000..b8d32d8 --- /dev/null +++ b/tests/Sanity/kernel-modules/runtest.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Sanity/kernel-modules +# Description: Tests systemtap working with kernel modules +# Author: Petr Muller +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2012 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh + +PACKAGE="systemtap" + +check_probes(){ + FAIL="" + rlAssertGrep init_module $1 || FAIL='yes' + rlAssertGrep cleanup_module $1 || FAIL='yes' + rlAssertGrep some_method $1 || FAIL='yes' + + if [ -n "$FAIL" ] + then + rlFileSubmit $1 $2.out + fi +} + +rlJournalStart + +rlPhaseStartSetup "Preparing modules" + rlRun "mkdir -p 'stap-underscore' 'stap-dash' 'stap-none'" + rlRun "cp module.c stap-underscore/test_module.c" + rlRun "cp module.c stap-dash/test-module.c" + rlRun "cp module.c stap-none/testmodule.c" + + cat Makefile.template | sed -e 's/MODULENAME/test_module/g' \ + | sed -e "s|DIRECTORY|$PWD/stap-underscore|g" > stap-underscore/Makefile + rlAssert0 "Creating Makefile for underscore variant" $? + cat Makefile.template | sed -e 's/MODULENAME/test-module/g' \ + | sed -e "s|DIRECTORY|$PWD/stap-dash|g" > stap-dash/Makefile + rlAssert0 "Creating Makefile for dash variant" $? + + cat Makefile.template | sed -e 's/MODULENAME/testmodule/g' \ + | sed -e "s|DIRECTORY|$PWD/stap-none|g" > stap-none/Makefile + rlAssert0 "Creating Makefile for no character variant" $? + + if [ -n "$ARCH" ] + then + rlLog "ARCH is set to: [$ARCH]" + rlLog "This interferes with 'make module', so it needs to be unset." + ARCHOLD="$ARCH" + unset ARCH + rlLog "ARCH is set to: [$ARCH]" + fi + rlRun "make -C stap-underscore module" + rlRun "make -C stap-dash module" + rlRun "make -C stap-none module" + if [ -n "$ARCHOLD" ] + then + rlLog "Restoring ARCH" + export ARCH="$ARCHOLD" + rlLog "ARCH is set to: [$ARCH]" + fi + +rlPhaseEnd + +rlPhaseStartTest "Testing underscore variant" + rlRun "cp stap-underscore/test_module.ko /lib/modules/$(uname -r)/" + rlRun "insmod stap-underscore/test_module.ko" + stap -L 'module("test_module").function("*")' -v > stap.out + check_probes stap.out "module-und-probe-und" + stap -L 'module("test-module").function("*")' -v > stap.out + check_probes stap.out "module-und-probe-dash" + sleep 1 + rlRun "rmmod test_module" + rlRun "rm -f /lib/modules/$(uname -r)/test_module.ko" +rlPhaseEnd + +rlPhaseStartTest "Testing dash variant" + rlRun "cp stap-dash/test-module.ko /lib/modules/$(uname -r)/" + rlRun "insmod stap-dash/test-module.ko" + stap -L 'module("test_module").function("*")' -v > stap.out + check_probes stap.out "module-dash-probe-und" + stap -L 'module("test-module").function("*")' -v > stap.out + check_probes stap.out "module-dash-probe-dash" + sleep 1 + rlRun "rmmod test-module" + rlRun "rm -f /lib/modules/$(uname -r)/test-module.ko" +rlPhaseEnd + +rlPhaseStartTest "Testing no separator variant" + rlRun "cp stap-none/testmodule.ko /lib/modules/$(uname -r)/" + rlRun "insmod stap-none/testmodule.ko" + stap -L 'module("testmodule").function("*")' -v > stap.out + check_probes stap.out "module-none-probe-none" + sleep 1 + rlRun "rmmod testmodule" + rlRun "rm -f /lib/modules/$(uname -r)/testmodule.ko" +rlPhaseEnd + +rlPhaseStartCleanup + rlRun "rm -rf stap-underscore stap-dash stap-none stap.out" +rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Sanity/quick-smoke-test/main.fmf b/tests/Sanity/quick-smoke-test/main.fmf new file mode 100644 index 0000000..0c8a945 --- /dev/null +++ b/tests/Sanity/quick-smoke-test/main.fmf @@ -0,0 +1,15 @@ +summary: Quick test that systemtap generally works +description: '' +contact: +- Petr Muller +component: +- systemtap +test: ./runtest.sh +framework: beakerlib +recommend: +- koji +- systemtap +- kernel-devel +duration: 1h +extra-summary: /tools/systemtap/Sanity/quick-smoke-test +extra-task: /tools/systemtap/Sanity/quick-smoke-test diff --git a/tests/Sanity/quick-smoke-test/runtest.sh b/tests/Sanity/quick-smoke-test/runtest.sh new file mode 100755 index 0000000..f04c2f1 --- /dev/null +++ b/tests/Sanity/quick-smoke-test/runtest.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# runtest.sh of /tools/systemtap/Sanity/quick-smoke-test + +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS" +export DEBUGINFOD_TIMEOUT=300 +# export DEBUGINFOD_PROGRESS=1 + + +rlJournalStart +rlPhaseStartTest + rlRun "rpm -qa | egrep '^(kernel|systemtap)' | sort" + rlRun "uname -r" + rlRun "stap-prep" + rlRun "stap -L 'process(\"stap\").mark(\"*\")' | grep pass" + rlRun "stap -v --example helloworld.stp" + rlRun "stap -v -T 10 -p4 -e 'probe kernel.function(\"do_exit\") {println(\$\$vars)}'" + rlRun "stap -v -T 60 -e 'probe kernel.function(\"vfs_read\"){ println(\$\$vars); exit() }'" +rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Sanity/stap-server-basic-sanity/main.fmf b/tests/Sanity/stap-server-basic-sanity/main.fmf new file mode 100644 index 0000000..248ecde --- /dev/null +++ b/tests/Sanity/stap-server-basic-sanity/main.fmf @@ -0,0 +1,17 @@ +summary: stap-server-basic-sanity +description: '' +contact: Martin Cermak +component: +- systemtap +test: ./runtest.sh +framework: beakerlib +recommend: +- systemtap +- kernel-debuginfo +- avahi +- systemtap-server +- dbus +- net-tools +duration: 45m +extra-summary: /tools/systemtap/Sanity/stap-server-basic-sanity +extra-task: /tools/systemtap/Sanity/stap-server-basic-sanity diff --git a/tests/Sanity/stap-server-basic-sanity/runtest.sh b/tests/Sanity/stap-server-basic-sanity/runtest.sh new file mode 100755 index 0000000..e121a51 --- /dev/null +++ b/tests/Sanity/stap-server-basic-sanity/runtest.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /tools/systemtap/Sanity/stap-server-basic-sanity +# Description: stap-server-basic-sanity +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +CMD='stap' +BIN=$(which --skip-alias $CMD) +PACKAGE="${PACKAGE:-$(rpm -qf --qf='%{name}\n' $BIN | head -1)}" + +export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS" +export DEBUGINFOD_TIMEOUT=300 + +function service_stap_server() { + action=$1 + retval=${2:-0} + sleep 5 + rlLogInfo "PACKAGE=$PACKAGE" + if echo $PACKAGE | grep -q devtoolset; then + __i=$(echo $PACKAGE | awk -F- '{print $2}') + rlRun "service devtoolset-$__i-stap-server $action" $retval + elif echo $PACKAGE | grep -q gcc-toolset; then + __i=$(echo $PACKAGE | awk -F- '{print $3}') + rlRun "service gcc-toolset-$__i-stap-server $action" $retval + else + rlRun "service stap-server $action" $retval + fi + sleep 5 +} + +_rhelmajor=$(rpm --eval '%{rhel}') + +rlJournalStart + rlPhaseStartSetup + rlRun "TMPDIR=$(mktemp -d)" + rlRun "pushd $TMPDIR" + rlAssertRpm dbus + rlAssertRpm avahi + rlAssertRpm net-tools # because of netstat + rlPhaseEnd + + rlPhaseStart FAIL "sanity check" + rlRun "stap -v -e 'probe begin { log(\"hello\"); exit() }'" + rlPhaseEnd + + rlPhaseStartTest + rlRun "service iptables stop" 0-255 + rlRun "service firewalld stop" 0-255 + service_stap_server stop + test $_rhelmajor -le 8 && \ + rlRun "service messagebus restart" + rlRun "service avahi-daemon restart" + service_stap_server start + + rlRun "netstat -tlp | grep stap" + rlRun "SERVER_PORT=$( netstat -tlpn | awk '/stap/ {print $4}' | grep -o '[0-9]*$' )" + + for SERVER_IP in '127.0.0.1' '[::1]'; do + rlLogInfo "Testing SERVER_IP=$SERVER_IP" + rlRun "stap --trust-servers=ssl,signer,all-users,no-prompt --use-server=$SERVER_IP:$SERVER_PORT" + rlRun "stap --use-server=$SERVER_IP:$SERVER_PORT -v -e 'probe begin { log(\"hello\"); exit() }' 2>&1 | tee output.log" + rlRun "grep 'Using a compile server' output.log" + rlRun "grep '^hello$' output.log" + done + rlPhaseEnd + + rlPhaseStartCleanup + service_stap_server stop + rlRun "popd" + rlRun "rm -r $TMPDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Sanity/userspace-probes/hello.c b/tests/Sanity/userspace-probes/hello.c new file mode 100644 index 0000000..60dac5b --- /dev/null +++ b/tests/Sanity/userspace-probes/hello.c @@ -0,0 +1,7 @@ +#include + +int main(void) { + printf("Hello world!\n"); + return 0; +} + diff --git a/tests/Sanity/userspace-probes/main.fmf b/tests/Sanity/userspace-probes/main.fmf new file mode 100644 index 0000000..b509a17 --- /dev/null +++ b/tests/Sanity/userspace-probes/main.fmf @@ -0,0 +1,16 @@ +summary: userspace-probes +description: '' +contact: Martin Cermak +component: +- systemtap +test: ./runtest.sh +framework: beakerlib +recommend: +- systemtap +- dyninst-devel +- gawk +duration: 5m +link: +- relates: https://bugzilla.redhat.com/show_bug.cgi?id=855981 +extra-summary: /CoreOS/systemtap/Sanity/userspace-probes +extra-task: /CoreOS/systemtap/Sanity/userspace-probes diff --git a/tests/Sanity/userspace-probes/runtest.sh b/tests/Sanity/userspace-probes/runtest.sh new file mode 100755 index 0000000..a25899b --- /dev/null +++ b/tests/Sanity/userspace-probes/runtest.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /CoreOS/systemtap/Sanity/userspace-probes +# Description: userspace-probes +# Author: Martin Cermak +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2013 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS" +export DEBUGINFOD_TIMEOUT=300 + +PACKAGE="$(rpm -qf $( which stap ) | head -n 1 )" +WORKDIR=$( mktemp -d ) +TESTUSER=mytestuser + + + +rlJournalStart + rlPhaseStart WARN "Check the environment" + if ! stap -V 2>&1 | grep -q 'enabled features:.*DYNINST'; then + rlLogWarning "No dyninst available in $PACKAGE" + rlPhaseEnd + rlJournalPrintText + rlJournalEnd + exit 0 + fi + rlRun "useradd $TESTUSER" 0,9 + rlRun "su $TESTUSER -c 'which stap'" + rlRun "rpm -qa | fgrep -e dyninst -e systemtap | sort" + rlPhaseEnd + + rlPhaseStartSetup + rlRun "cp hello.c testcase*.sh $WORKDIR" + rlRun "chown -R $TESTUSER:$TESTUSER $WORKDIR" + rlPhaseEnd + + rlPhaseStart FAIL "Testcase 1" + rlRun "which gcc" + rlRun "su $TESTUSER -c 'gcc -g -o $WORKDIR/hello $WORKDIR/hello.c'" + rlRun "su $TESTUSER -c '$WORKDIR/hello'" + rlRun "chmod a+x $WORKDIR/testcase1.sh" + rlRun "su $TESTUSER -c '$WORKDIR/testcase1.sh $WORKDIR'" + + LOG="$WORKDIR/stapout.log" + + rlRun "cat $LOG" + rlRun "grep '^process(\"$WORKDIR/hello\").function(\"main@$WORKDIR/hello.c:3\")$' $LOG" + rlRun "grep -i error $LOG" 1 + rlPhaseEnd + + rlPhaseStart FAIL "Testcase 2" + rlRun "chmod a+x $WORKDIR/testcase2.sh" + rlRun "su $TESTUSER -c '$WORKDIR/testcase2.sh $WORKDIR'" + + LOG="$WORKDIR/stapout.log" + + rlRun "cat $LOG" + rlRun "grep '^\*\*\*\ exiting\ \*\*\*$' $LOG" + rlRun "egrep -i 'error|warning' $LOG" 1 + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "userdel $TESTUSER" 0-255 + rlRun "rm -rf /home/$TESTUSER $WORKDIR" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/tests/Sanity/userspace-probes/testcase1.sh b/tests/Sanity/userspace-probes/testcase1.sh new file mode 100755 index 0000000..818d2cd --- /dev/null +++ b/tests/Sanity/userspace-probes/testcase1.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +stap -e "probe process(\"$1/hello\").function(\"main\") { println(pn()) }" --runtime=dyninst -c "$1/hello" -o "$1/stapout.log" diff --git a/tests/Sanity/userspace-probes/testcase2.sh b/tests/Sanity/userspace-probes/testcase2.sh new file mode 100755 index 0000000..d270d09 --- /dev/null +++ b/tests/Sanity/userspace-probes/testcase2.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +stap --runtime=dyninst -e 'probe end { printf("*** exiting ***\n"); exit() }' -c "$1/hello" -o "$1/stapout.log" +