Получить все номера строк в программе на C ++, где вызываются вызовы функций - PullRequest
0 голосов
/ 26 сентября 2019

Например, у меня есть программа на C ++:

#include <iostream>
#include<vector>

int main() {

    int a =0;
    //A vector of size 10 with all values as 1
    std::vector<std::size_t> v(10, 1);
    assert(v.size() == 10);
    return 0;
}

Есть ли способ найти номер строки, в которой вызывается вызов функции:

Итак, я бы набрал номера строк, гдевектор v создается, и когда вызывается функция size () вектора.

Утилита на любом языке программирования принимается, но предпочтение будет отдаваться решению gdb для поиска вызовов функций.

1 Ответ

1 голос
/ 26 сентября 2019

Я бы выстроил числа, где строится вектор v и когда вызывается функция size () вектора.

В GDB нет простого способа сделать это, но вы можете использоватьobjdump -d чтобы получить адреса CALL инструкций.Пример: использование вашей программы, добавление отсутствующего #include <assert.h> и построение его с помощью:

$ gcc -g t.cc -fno-pie -no-pie

$ objdump -dC a.out | grep 'call.*>::vector'
  4011da:   e8 f9 00 00 00          callq  4012d8 <std::vector<unsigned long, std::allocator<unsigned long> >::vector(unsigned long, unsigned long const&, std::allocator<unsigned long> const&)>

$ objdump -dC a.out | grep 'call.*>::size'
  4011f2:   e8 8f 01 00 00          callq  401386 <std::vector<unsigned long, std::allocator<unsigned long> >::size() const>

Теперь, когда вы знаете адреса инструкций CALL, вы можете перевести их в функцию / файл / строку, используя addr2line:

$ addr2line -fe a.out 4011da 4011f2
main
/tmp/t.cc:9
main
/tmp/t.cc:10 (discriminator 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...