Соотнесите трассировку стека с исходным кодом в файле MATLAB .mexa64 - PullRequest
1 голос
/ 26 марта 2020

У меня есть пользовательские C привязки, вызванные из Matlab, и иногда я получаю ошибку сегментации. Как я могу определить в своем исходном коде, что соответствующий оператор создает SEGFAULT?

Моя C функция называется Сопряжение в исходном файле. Сопряжение. c

Stack Trace (from fault):
[  0] 0x00007fff6bc76d00 Pairing.mexa64+00015616
[  1] 0x00007fff6bc74330 Pairing.mexa64+00004912 mexFunction+00001862
[  2] 0x00007fffe2b4f213 MATLAB/R2020a/bin/glnxa64/libmex.so+00582163

результат nm -a Pairing.mexa64 | grep ' N ' равен

0000000000000000 N .debug_abbrev
0000000000000000 N .debug_aranges
0000000000000000 N .debug_info
0000000000000000 N .debug_line
0000000000000000 N .debug_str

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Вот мой трюк (работает каждый раз), запустите его в окне терминала

matlab -nojvm -nosplash -r 'my_script'  -D"valgrind --error-limit=no --tool=memcheck -v --log-file=valgrind.log" 

, предпочтительно запустите это под Linux или Ma c, но вы также можете сделать это в Windows с использованием cygwin64 / msys2. Необходимо установить valgrind перед использованием - как только он сбросит журнал в valgrind.log, откройте его с помощью текстового редактора, и вы увидите все ошибки памяти, захваченные valgrind.

для кодов CUDA, вы также можете замените команду и параметры valgrind на cuda-memcheck, сделайте что-то подобное, но для графического процессора.

сделайте ваш тестовый скрипт my_script.m очень простым, например, загрузите файл .mat, а затем вызовите свой mex работать немедленно, чтобы избежать длительных накладных расходов.

0 голосов
/ 31 марта 2020

То, как я решил, было следующим:

1) Использовать objdump -d Pairing.mexa64 > Pairing_obj.

2) Перевести 00015616 в hex = 0x3d00.

3) Найти соответствующее утверждение и распознайте произведенную сборку.

4) Поймите, что это раз, когда определенная переменная разыменовывается.

Я все еще ищу способ, которым это можно было бы сделать проще.

...