Offcputime печатает [неизвестные] кадры для пользовательского стекаLinux

Ответить
Anonymous
 Offcputime печатает [неизвестные] кадры для пользовательского стека

Сообщение Anonymous »

Кто-то сообщил о подобной проблеме на GitHub: https://github.com/iovisor/bcc/issues/2657. Но вопрос не решается уже шесть лет, поэтому задаю вопрос здесь. Вот минимальный рабочий пример. :

Код: Выделить всё

#include 
#include 

void f() {
int i;
for (i = 0; i < 3; ++i) {
sleep(1);
}
}

int main() {
f();
return 0;
}

Код: Выделить всё

gcc -O0 -g -fno-omit-frame-pointer test.c -o test
:

Код: Выделить всё

#!/usr/bin/env sh
set -m # To prevent bg process from ignoring SIGINT
./test &
test_pid=$!
sudo offcputime-bpfcc -df -p $! &
stat_pid=$!
wait $test_pid
kill -INT $stat_pid
wait $stat_pid

Код: Выделить всё

./test.sh
Напечатанный стек:

Код: Выделить всё

test;[unknown];-;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_clock_nanosleep;common_nsleep;hrtimer_nanosleep;do_nanosleep;schedule;__schedule;finish_task_switch.isra.0 1000151
Пользовательский стек, который должен быть f, печатается как [неизвестно]. Я подозревал, что это связано с тем, что glibc компилируется без указателя кадра, что предотвращает обход стека. Поэтому я скомпилировал glibc и gcc из исходного кода с помощью -fno-omit-frame-pointer:

Код: Выделить всё

cd glibc
git checkout release/2.36/master
mkdir -p build
cd build
CFLAGS='-O2 -fno-omit-frame-pointer'
CXXFLAGS='-O2 -fno-omit-frame-pointer'
../configure --prefix=$HOME/no-omit-frame-pointer CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS"
make -j$(nproc)
make install
cd ../..

version=12.4.0
cd gcc-$version
mkdir -p build
cd build
export CFLAGS="-O2 -fno-omit-frame-pointer"
export CXXFLAGS=$CFLAGS
../configure --disable-multilib --enable-languages=c,c++ --prefix=$HOME/no-omit-frame-pointer
make -j$(nproc)
make install
cd ../..
И скомпилируйте test.c с их помощью:

Код: Выделить всё

INSTALL_ROOT=$HOME/no-omit-frame-pointer
export CC=$INSTALL_ROOT/bin/gcc
export CXX=$INSTALL_ROOT/bin/g++
export CFLAGS="-O2 -fno-omit-frame-pointer"
export CXXFLAGS=$CFLAGS
export LDFLAGS="-Wl,-rpath=$INSTALL_ROOT/lib -Wl,-rpath=$INSTALL_ROOT/lib64 -Wl,--dynamic-linker=$INSTALL_ROOT/lib/ld-linux-x86-64.so.2"
unset LD_LIBRARY_PATH

$CC -O0 -g test.c -o test $CFLAGS $LDFLAGS
И теперь тест использует glibc с указателем кадра:

Код: Выделить всё

$ ldd test
linux-vdso.so.1 (0x00007f7563cc1000)
libc.so.6 => /home/searchstar/no-omit-frame-pointer/lib/libc.so.6 (0x00007f7563ad1000)
/home/searchstar/no-omit-frame-pointer/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f7563cc3000)
Однако проблема остается:

Код: Выделить всё

./test.sh

Код: Выделить всё

test;[unknown];[unknown];[unknown];[unknown];[unknown];[unknown];[unknown];[unknown];-;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_clock_nanosleep;common_nsleep;hrtimer_nanosleep;do_nanosleep;schedule;__schedule;finish_task_switch.isra.0 1000157
Я подозреваю, что offcputime фактически завершил раскручивание стека по указателям кадров, но не может разрешить символы. Но похоже, что offcputime не предоставляет возможности указать путь к двоичному файлу с отладочной информацией. Есть ли у кого-нибудь какие-либо идеи по этому вопросу?


Подробнее здесь: https://stackoverflow.com/questions/798 ... user-stack
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»