Как заставить gdb показать исходное имя функции неискажения на модели дизассемблирования?

Вот что std::make_shared делает : Создать новый объект, используя переданные аргументы для передачи в подходящий конструктор. В вашем случае конструктор копирования.

То есть оператор

std::shared_ptr wsk= std::make_shared(mem);

эквивалентен

std::shared_ptr wsk(new MemoryManager(mem));

Если вы хотите, чтобы ваш общий указатель ссылался на существующий объект, то вам нужно использовать

std::shared_ptr wsk(&mem);

Но это принесет с собой другие проблемы, так как, когда последний общий указатель будет уничтожен, он попытается освободить память, что невозможно для объекта, не созданного new. Для этого есть два решения: либо создать (или использовать существующий) null-deleter , который на самом деле ничего не delete; Или позволяя общему указателю обрабатывать полное владение (от создания до уничтожения) объекта.

И это действительно, как вы должны смотреть на умные указатели, не как своего рода самоуничтожающийся указатель, а с точки зрения владения ресурсом .

19
задан Cœur 5 September 2017 в 16:32
поделиться

3 ответа

на подсказке (gdb) можно было сделать развязку мейнтета _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc.

В руководстве сказано:

`set print asm-demangle'
`set print asm-demangle on'
     Print C++ names in their source form rather than their mangled
     form, even in assembler code printouts such as instruction
     disassemblies.  The default is off.

К сожалению, оно не работает:

(gdb) set print asm-demangle on
(gdb) disas
Dump of assembler code for function _Z12outputStringPKc:
0x00000000004009c4 <outputString(char const*)+0>:   push   %rbp
0x00000000004009c5 <outputString(char const*)+1>:   mov    %rsp,%rbp
0x00000000004009c8 <outputString(char const*)+4>:   sub    $0x10,%rsp
0x00000000004009cc <outputString(char const*)+8>:   mov    %rdi,-0x8(%rbp)
0x00000000004009d0 <outputString(char const*)+12>:  mov    $0x400bb0,%esi
0x00000000004009d5 <outputString(char const*)+17>:  mov    $0x6012a0,%edi
0x00000000004009da <outputString(char const*)+22>:  callq  0x400798 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x00000000004009df <outputString(char const*)+27>:  mov    %rax,%rdi
0x00000000004009e2 <outputString(char const*)+30>:  mov    -0x8(%rbp),%rsi
0x00000000004009e6 <outputString(char const*)+34>:  callq  0x400798 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x00000000004009eb <outputString(char const*)+39>:  mov    %rax,%rdi
0x00000000004009ee <outputString(char const*)+42>:  mov    $0x4007c8,%esi
0x00000000004009f3 <outputString(char const*)+47>:  callq  0x4007b8 <_ZNSolsEPFRSoS_E@plt>
0x00000000004009f8 <outputString(char const*)+52>:  leaveq 
0x00000000004009f9 <outputString(char const*)+53>:  retq   
End of assembler dump.

Настройка изменила способ печати текущей функции, а не способ печати вызываемых ею функций (что, как я полагаю, и нужно).

Я думаю, что это ошибка в GDB, пожалуйста, зарегистрируйте ошибку в bugzilla.

.
24
ответ дан 30 November 2019 в 04:16
поделиться

gdb показывают исходное имя функции неискажения на модели дизассемблирования::

необходимо сделать, это ступает каждый раз каждый раз, когда Вы собираетесь отладить. 1. печать набора demangle на 2. печать набора asm-demangle на

Еще можно создать файл ~/.gdbinit энергии как файл ~/.vimrc и установить следующие шаги так Вы никакая потребность сделать каждый раз на. 1 печать набора, симпатичная на 2 печати набора demangle на 3 печати набора asm-demangle на

1
ответ дан 30 November 2019 в 04:16
поделиться

Я не помню, чтобы я когда-нибудь находил автоматический способ для gdb сделать это. Я всегда просто копировал и вставлял символ и прогонял его через утилиту Linux c++filt для разворачивания.

.
3
ответ дан 30 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: