Это сложно. Я пробовал Xcode и Eclipse с автономным приложением C ++, но было очень трудно заставить работать все заголовки и библиотеки. Кроме того, код RcppExport вызывает вашу настоящую функцию R через указатель, который, кажется, действительно запутывает Xcode, и я не мог войти в свою функцию.
Я закончил с (gdb или lldb): В R:
R -d lldb
В отладчике установите точку останова:
b functionName
run
В R:
.Call(etc) # or just call your R code which invokes compiled C/C++ code
Затем, когда произойдет разрыв, вернитесь в отладчик, вы можете шагать, исследовать кадры и т. Д. .
Этот краткий справочник по команде lldb / gdb очень помог.
Забудьте о попытке сделать это в графическом интерфейсе. Надеюсь, Rstudio это сделает.
Имеется только одна общая память ядра. В нем у каждого процесса есть свой task_struct + стек ядра (по умолчанию 8K).
При переключении контекста где-то сохраняется старый указатель стека, а фактический указатель стека заставляется указывать на верх стека (или низ в зависимости от архитектуры оборудования) нового процесса, который будет запущен.
В этой старой статье говорится, что каждый процесс имеет свой собственный стек ядра. См. Комментарии к тому, почему это кажется очень хорошим дизайном.
Я попытался прочитать текущий исходный код , чтобы убедиться, но поскольку стек ядра «неявный», он не отображается в task_struct
. Об этом упоминается в статье.
Этот ответ был отредактирован, чтобы учесть мудрость из комментариев. Спасибо.
В книге Роберта Лава «Разработка ядра Linux» есть хорошее объяснение стека ядра процесса.
И да, каждый процесс имеет свой собственный стек ядра, и, если я не ошибаюсь, его указатель хранится в структуре thread_info. Но я не совсем уверен в этом, а struct task_struct хранится в начале или в конце стека ядра процесса, в зависимости от архитектуры процессора.
Ура. Карлос Майолино